一、rustfs/rustfs:統一多后端的文件系統抽象

1.1 項目概述

rustfs/rustfs 是一款以 Rust 語言編寫的文件系統抽象層庫,目的是讓開發者能夠通過統一的 API 訪問本地文件、Amazon S3、Google Cloud Storage、IPFS 等后端存儲。核心設計思路如下:

1.2 安裝與依賴

在你的 Cargo.toml 中引入:

[dependencies]
rustfs = { git = "https://github.com/rustfs/rustfs.git", branch = "main" }
tokio = { version = "1", features = ["full"] }

> 同時你可能還需要為具體后端添加對應的 feature,例如:rustfs-s3rustfs-gcs 等。

1.3 快速示例

以下示例展示了如何使用 rustfs 訪問本地文件和 S3 存儲,并列出根目錄下的所有文件:

use rustfs::{FileSystem, LocalFs, S3Fs};
use std::sync::Arc;

#[tokio::main]
async fn main() - > anyhow::Result < () < {
    // 本地文件系統
    let local = Arc::new(LocalFs::new("/path/to/dir"));
    // S3 文件系統
    let s3 = Arc::new(S3Fs::new("my-bucket", "us-east-1")?);

    // 列出本地文件
    println!("Local files:");
    for entry in local.read_dir("/").await? {
        println!(" - {}", entry.path());
    }

    // 列出 S3 對象
    println!("\nS3 objects:");
    for entry in s3.read_dir("/").await? {
        println!(" - {}", entry.path());
    }

    Ok(())
}

二、pocketbase/pocketbase:輕量級全棧后端即服務

2.1 項目概述

pocketbase/pocketbase 是一個用 Go 語言編寫的開源 BaaS(Backend-as-a-Service)項目,目標是讓前端或移動端開發者能夠“零運維”快速擁有一套完整的后端,包括:

2.2 安裝與運行

下載預編譯二進制包,或自行編譯:

# 下載并賦予執行權限
curl -L https://github.com/pocketbase/pocketbase/releases/download/v0.15.1/pocketbase_0.15.1_linux_amd64.zip -o pb.zip
unzip pb.zip && chmod +x pocketbase

# 初次運行將創建數據目錄
./pocketbase serve

在瀏覽器訪問 http://127.0.0.1:8090/_/,即可看到 Admin 控制臺,初始化管理員賬號后便可創建數據模型與用戶。

2.3 快速上手:創建「任務」集合

  1. 登錄 Admin 界面,點擊 Collections → New collection,命名 tasks
  2. 添加字段:

  3. 在代碼層面,通過 HTTP 請求操作數據,示例(Node.js):

    import fetch from 'node-fetch';
    
    // 假設已通過登錄接口獲取到 token
    const TOKEN = 'YOUR_JWT_TOKEN';
    
    async function createTask(title) {
     const res = await fetch('http://127.0.0.1:8090/api/collections/tasks/records', {
       method: 'POST',
       headers: {
         'Content-Type': 'application/json',
         'Authorization': Bearer ${TOKEN},
       },
       body: JSON.stringify({ title, completed: false }),
     });
     return res.json();
    }
    
    createTask('學習 Rust').then(console.log);

三、smallcloudai/refact:機器學習模型重構工具

3.1 項目概述

smallcloudai/refact 是一款面向機器學習工程師和研究人員的模型重構與優化工具。它支持:

3.2 安裝與使用

# Python 環境安裝
pip install refact

示例:對 PyTorch 模型進行 8-bit 量化并導出:

from refact import Quantizer

# 加載模型
model = torch.load('model.pt')

# 量化
quantizer = Quantizer(model, backend='pytorch', precision=8)
qmodel = quantizer.quantize()

# 保存量化后模型
qmodel.save('model_quantized.pt')

更多高級用法請參考官方文檔。


四、深度剖析:基于 Rust 構建 GitHub 熱門 Issues CLI

為了幫助大家更好地理解如何借助 Rust 與 GitHub API 快速構建實用工具,下面以 rustfs 社區推薦方式引用視頻中的示例,分步驟帶你用 Rust + Tokio 構建一個命令行程序,從指定倉庫批量獲取最高贊的 Issues。

4.1 視頻背景與目標


正如視頻開頭所述,教學最好的方式就是“build cool stuff”。本示例將創建一個 CLI 工具,核心功能:

  1. 獲取指定 GitHub 倉庫所有 Issues
  2. 過濾出非 PR 的普通 Issue
  3. 對每個 Issue 再次調用 Reactions API,獲取“??”數量
  4. 根據點贊數排序,輸出 Top N Issues

該示例分兩部分,第一部分實現基礎功能,第二部分引入并發與優化。

4.2 項目初始化

cargo new gh_top_issues
cd gh_top_issues

Cargo.toml 中添加依賴:

[dependencies]
tokio = { version = "1", features = ["full"] }
reqwest = { version = "0.11", features = ["json"] }
serde = { version = "1.0", features = ["derive"] }
dotenv = "0.15"
futures = "0.3"
anyhow = "1.0"

在項目根目錄創建 .env,寫入:

GITHUB_TOKEN=your_personal_access_token_here

4.3 定義數據結構

根據 GitHub REST API 文檔,我們關心的字段有:

Rust 代碼:

use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
struct Issue {
    number: u64,
    title: String,
    #[serde(rename = "pull_request")]
    pr: Option < serde_json::Value > ,
}

#[derive(Debug, Serialize, Deserialize)]
struct IssueReaction {
    content: String,
    user: User,
}

#[derive(Debug, Serialize, Deserialize)]
struct User {
    login: String,
}

4.4 基礎功能實現:獲取 Issues

use reqwest::header::{HeaderMap, HeaderValue, AUTHORIZATION, USER_AGENT, ACCEPT};
use std::env;

async fn get_issues(owner: &str, repo: &str, page: u32) - > anyhow::Result < Vec < Issue > > {
    let token = env::var("GITHUB_TOKEN")?;
    let url = format!(
        "https://api.github.com/repos/{}/{}/issues?per_page=100&page={}",
        owner, repo, page
    );

    let mut headers = HeaderMap::new();
    headers.insert(AUTHORIZATION, format!("Bearer {}", token).parse()?);
    headers.insert(USER_AGENT, HeaderValue::from_static("rust-cli"));
    headers.insert(ACCEPT, HeaderValue::from_static("application/vnd.github.v3+json"));

    let resp = reqwest::Client::new()
        .get(&url)
        .headers(headers)
        .send()
        .await?;

    if !resp.status().is_success() {
        return Ok(vec![]);
    }

    let issues: Vec < Issue > = resp.json().await?;
    // 過濾掉 PR
    Ok(issues.into_iter().filter(|i| i.pr.is_none()).collect())
}

4.5 處理翻頁與遞歸

GitHub API 每頁最多返回 100 條,通過響應頭中的 Link 字段判斷是否有下一頁:

fn extract_next_link(headers: &HeaderMap) - > Option < String > {
    headers
        .get("link")
        .and_then(|v| v.to_str().ok())
        .and_then(|s| {
            s.split(',')
             .find(|part| part.contains("rel=\"next\""))
        })
        .map(|part| {
            part.split(';').next().unwrap()
                .trim()[1..part.find(' >').unwrap()].to_string()
        })
}

封裝遞歸調用為 BoxFuture,不斷獲取下一頁,直至無 next link。

4.6 獲取 Reactions 并排序

async fn get_issue_reactions(owner: &str, repo: &str, issue_number: u64) - > anyhow::Result < usize > {
    let token = env::var("GITHUB_TOKEN")?;
    let url = format!(
        "https://api.github.com/repos/{}/{}/issues/{}/reactions",
        owner, repo, issue_number
    );

    let mut headers = HeaderMap::new();
    headers.insert(AUTHORIZATION, format!("Bearer {}", token).parse()?);
    headers.insert(USER_AGENT, HeaderValue::from_static("rust-cli"));
    headers.insert(ACCEPT, HeaderValue::from_static("application/vnd.github.squirrel-girl-preview"));

    let resp = reqwest::Client::new()
        .get(&url)
        .headers(headers)
        .send()
        .await?;

    let reactions: Vec < IssueReaction > = resp.json().await?;
    Ok(reactions.into_iter().filter(|r| r.content == "+1").count())
}

最終在 main 中:

  1. 批量獲取所有 Issues
  2. 并發調用 get_issue_reactions(下一集內容)
  3. 根據點贊數排序,輸出 Top 10

4.7 并發與性能優化預告

如視頻所言,下一步將在 Tokio 中使用 futures::stream::FuturesUnorderedtokio::task::spawn,將對每個 Issue 的 Reaction 請求并發化,大幅提升整體速度。


五、將示例與 rustfs 場景結合

既然我們掌握了上述原理,不妨將這種“基于 API 構建 CLI 工具”的思路,遷移到 rustfs/rustfs。例如,可以借助 rustfs 統一接口,實現:

  1. 掃描本地或遠端存儲中所有 Markdown 文檔
  2. 解析文檔標題,調用 GitHub API 同步遠端 Issue 鏈接
  3. 將文件系統與 GitHub Issue 目錄“合二為一”

這正是開源項目結合的魅力:一個項目解決存儲,一套工具解決 API 交互,你的業務場景便可以靈活擴展。


六、結語

2025年7月第2周,rustfs/rustfspocketbase/pocketbasesmallcloudai/refact 三款熱門倉庫各具特色——前者讓多后端文件操作無縫銜接,后者讓后端即服務觸手可及,后者則為模型重構提供利器。更重要的是,通過以上示例,我們學習了如何使用 Rust 與 GitHub API 打通數據流,快速構建高效 CLI 工具。

希望本文能幫助你:

原文引自YouTube視頻:https://www.youtube.com/watch?v=zzfZ13_Ig78

上一篇:

MCP 與 API:探索大語言模型與外部數據源的連接方式

下一篇:

阿里云短信服務(Alibaba Cloud SMS API)?—?國內領先穩定的 SMS API Providers
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費