Rust AUR包管理库raur的使用,raur提供Rust插件库的Arch Linux AUR仓库查询与安装功能

Rust AUR包管理库raur的使用

raur是一个用于与AUR(Arch User Repository) RPC接口交互的Rust库。

示例代码

以下是raur库的基本使用示例:

use raur::Raur;

let raur = raur::Handle::new();

// 使用`search`方法通过关键字搜索包(支持多种搜索策略)
let pkgs = raur.search("pacman").await?;
assert!(pkgs.len() > 10);

for pkg in pkgs {
    println!("{:30}{}", pkg.name, pkg.version);
}

// 使用`info`方法获取包信息,未找到的包会被静默忽略
let pkgs = raur.info(&["spotify", "discord-canary"]).await?;
assert_eq!(pkgs.len(), 2);

for pkg in pkgs {
    println!("{:30}{}", pkg.name, pkg.version);
}

完整示例

下面是一个更完整的示例,展示了如何使用raur库进行AUR包的查询和安装:

use raur::Raur;
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    // 创建raur句柄
    let raur = raur::Handle::new();
    
    // 1. 搜索包
    println!("搜索'rust'相关的AUR包:");
    let rust_pkgs = raur.search("rust").await?;
    
    for (i, pkg) in rust_pkgs.iter().take(5).enumerate() {
        println!("{}: {:<30} {}", i+1, pkg.name, pkg.version);
    }
    
    // 2. 获取包详细信息
    println!("\n获取'spotify'和'visual-studio-code-bin'的详细信息:");
    let pkgs = raur.info(&["spotify", "visual-studio-code-bin"]).await?;
    
    for pkg in pkgs {
        println!("\n包名: {}", pkg.name);
        println!("版本: {}", pkg.version);
        println!("描述: {}", pkg.description);
        println!("维护者: {}", pkg.maintainer);
        println!("最后更新: {}", pkg.last_updated);
        println!("投票数: {}", pkg.num_votes);
        println!("流行度: {}", pkg.popularity);
    }
    
    // 3. 安装包的示例(实际安装需要调用外部命令如yay或paru)
    /*
    use std::process::Command;
    
    println!("\n安装visual-studio-code-bin...");
    let output = Command::new("yay")
        .arg("-S")
        .arg("visual-studio-code-bin")
        .output()?;
    
    if output.status.success() {
        println!("安装成功!");
    } else {
        println!("安装失败: {}", String::from_utf8_lossy(&output.stderr));
    }
    */
    
    Ok(())
}

安装

在您的项目中添加raur依赖:

[dependencies]
raur = "7.0.0"

或者运行以下命令:

cargo add raur

特性

raur库提供以下主要功能:

  1. 通过关键字搜索AUR包
  2. 获取一个或多个包的详细信息
  3. 支持异步操作
  4. 轻量级且易于使用

注意:raur库本身只提供查询功能,实际安装AUR包需要使用yay或paru等AUR助手工具。


1 回复

Rust AUR包管理库raur的使用指南

raur是一个Rust库,提供了与Arch Linux用户仓库(AUR)交互的功能,允许开发者查询、搜索和获取AUR包的信息。

主要功能

  • 搜索AUR包
  • 获取包信息
  • 获取包构建文件
  • 支持RPC和git接口

安装方法

在Cargo.toml中添加依赖:

[dependencies]
raur = "0.13"

基本使用方法

1. 搜索AUR包

use raur::Raur;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let raur = raur::Handle::new();
    let results = raur.search("rust").await?;
    
    for pkg in results {
        println!("Found package: {} - {}", pkg.name, pkg.description.unwrap_or_default());
    }
    
    Ok(())
}

2. 获取包信息

use raur::Raur;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let raur = raur::Handle::new();
    let info = raur.info(&["rustup", "cargo"]).await?;
    
    for pkg in info {
        println!("Package: {}", pkg.name);
        println!("Version: {}", pkg.version);
        println!("Maintainer: {}", pkg.maintainer.unwrap_or_default());
        println!();
    }
    
    Ok(())
}

3. 获取PKGBUILD文件

use raur::Raur;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let raur = raur::Handle::new();
    let pkgbuild = raur.pkgbuild("rustup").await?;
    
    println!("PKGBUILD for rustup:\n{}", pkgbuild);
    
    Ok(())
}

高级用法

自定义RPC端点

use raur::Raur;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let raur = raur::Handle::new()
        .custom_rpc_url("https://your-aur-mirror/rpc");
    
    // 然后像平常一样使用
    let results = raur.search("rust").await?;
    
    Ok(())
}

同时使用多个包名查询

use raur::Raur;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let raur = raur::Handle::new();
    let packages = &["rust", "cargo", "rustup"];
    let results = raur.info(packages).await?;
    
    for pkg in results {
        println!("{}: {}", pkg.name, pkg.version);
    }
    
    Ok(())
}

错误处理

raur提供了详细的错误类型,建议使用thiserroranyhow进行错误处理:

use raur::Raur;
use anyhow::Context;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let raur = raur::Handle::new();
    let results = raur.search("rust")
        .await
        .context("Failed to search AUR packages")?;
    
    // 处理结果...
    
    Ok(())
}

完整示例

use raur::Raur;
use anyhow::{Context, Result};

#[tokio::main]
async fn main() -> Result<()> {
    // 初始化raur处理器
    let raur = raur::Handle::new();
    
    // 示例1:搜索包
    println!("=== 搜索AUR包 ===");
    let search_results = raur.search("rust")
        .await
        .context("搜索AUR包失败")?;
        
    for pkg in &search_results[..3] {  // 只显示前3个结果
        println!("- {}: {}", pkg.name, pkg.description.as_deref().unwrap_or("无描述"));
    }
    
    // 示例2:获取多个包信息
    println!("\n=== 获取包信息 ===");
    let packages = &["rustup", "cargo", "rust"];
    let info_results = raur.info(packages)
        .await
        .context("获取包信息失败")?;
        
    for pkg in info_results {
        println!("包名: {}", pkg.name);
        println!("版本: {}", pkg.version);
        println!("维护者: {}", pkg.maintainer.as_deref().unwrap_or("无"));
        println!("最后更新: {}", pkg.last_modified);
        println!();
    }
    
    // 示例3:获取PKGBUILD
    println!("=== 获取PKGBUILD ===");
    if let Some(first_pkg) = search_results.first() {
        let pkgbuild = raur.pkgbuild(&first_pkg.name)
            .await
            .context("获取PKGBUILD失败")?;
        println!("{}的PKGBUILD:\n{}", first_pkg.name, pkgbuild);
    }
    
    Ok(())
}

注意事项

  1. 所有方法都是异步的,需要使用async/await
  2. 需要tokio或类似异步运行时
  3. 大量查询时请注意遵守AUR的使用条款

raur库为Rust开发者提供了便捷的AUR访问方式,非常适合需要与Arch Linux仓库交互的工具开发。

回到顶部