使用 Gitea 做 Rust Cargo 的 Registries

记录使用 Gitea 做 Rust Cargo 的 Registries,实际私有的 Registries 也有 Alexandrie 实现,即使不使用 Registries ,也可以指定依赖的 Git 路径,可以指定 tag ,ref 等等,不过 Registries 确实跟方便一些,而 Gitea 的 Registries 也算好用。

Gitea 部署和配置可见官方文档。我这里贴出 docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: "3"

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:latest
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    networks:
      - gitea
    volumes:
      - ./gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "22:22"

下面介绍使用 Gitea 做 Rust Cargo 的 Registries。首先创建一个组织,实际上在自己账户的库里操作也可以。创建完成后进入组织,打开设置-软件包-Cargo 注册中心索引 ,点击初始化索引。然后可以看到组织仓库里出现一个 _cargo-index 库。

个人电脑上配置 Registries,可以在全局配置文件 ~/.cargo/config 中写入,也可以在每个使用这个 Registries 的 Rust 项目根目录下创建 .cargo/config 写入。

1
2
3
4
5
6
[registries.gitea]
index  = "https://api.example.com/RustLib/_cargo-index.git"
token = "Bearer 令牌"

[net]
git-fetch-with-cli = true

token 为 gitea 的令牌,然后在要上传到库 minilib1 目录下执行

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cargo login --registry gitea # 登录 需要输入令牌
cargo publish # 上传软件包

# 全部支持命令
cargo publish
cargo add
cargo install
cargo yank
cargo unyank
cargo search

等命令,可以如果成功,可以在 组织-软件包 中找到刚刚 publish 的包。

下面使用这个库,创建一个项目,依赖这么写就行,:

1
2
[dependencies]
minilib1 = { version = "0.1.0", registry = "gitea" }

在 main.rs 就可以正常使用这个库的函数了。

需要注意的是,组织和库都可以是私有。但是我有时报错 401 ,组织改为公开,然后改为私有就好使了,可能是 bug 也可能是我误操作。此外,经过实验,配置文件中的 启用登录访问限制 需要关闭才能生效(版本: 1.19.3 )。启用登录访问限制后,组织公开和项目公开即使有鉴权,也不能通过 cargo run 自动拉取,会出现 401。