注册账号

https://crates.io/

它暂时只能用 Github 登录

获取 token

注册成功并登录后, 进入 Account Settings 找到 API Access 部分生成 Token

这里, 假设你的 token 为 tokenxxx

使用 cargo 登录

$ cargo login tokenxxx
       Login token for `crates.io` saved

创建一个库项目

cargo new ipdbv4-rs

然后编写你的库代码. 目录类似

├── Cargo.lock
├── Cargo.toml
├── README.md
├── ipipfree.ipdb
├── rustfmt.toml
├── src
│   ├── benches
│   │   └── my_benchmark.rs
│   ├── helper.rs
│   ├── lib.rs
│   └── main.rs

完善你的元数据

[package]
name = "ipdb_rs"
version = "0.1.0"
authors = ["emacsist <emacsist@qq.com>"]
edition = "2018"
description = "IPDB 地址库的 rust 非官方版本"
keywords = ["ipdb", "rust"]
categories = ["parsing"]
readme = "README.md"
license = "MIT OR Apache-2.0"
repository = "https://github.com/emacsist/ipdb-rs.git"
exclude = [
    "ipipfree.ipdb",
]

以上几个最好都用

格式化代码

# 安装 fmt
rustup component add rustfmt

# 使用
cargo fmt

代码检查

# 安装 clippy
rustup component add clippy

# 检查
cargo clippy

# 自动应用检查的建议. 要使用 nightly 版本
rustup component add rustfmt --toolchain nightly
cargo +nightly clippy --fix -Z unstable-options

查看打包时包含的文件列表

cargo package --list

根据自己的情况修改. 比如上面的, 我添加了 exclude=["ipipfree.ipdb"]

发布

cargo publish

移除版本

它不能删除旧版本的包, 但可以阻止新的项目使用该版本的包

cargo yank --vers 1.0.1

# 取消移除
cargo yank --vers 1.0.1 --undo

遇到的问题

crate lazy_static is pulled from registry

https://github.com/rust-lang/cargo/blob/ae08099ce1f45852852b355eec92743abc9fb980/src/cargo/ops/registry.rs#L156-L158

https://github.com/rust-lang/crates-io-cargo-teams/issues/21

这通常是因为使用了镜像. 你懂的…

可以在 publish 的时候, 直接指定官方源即可.

cargo publish --index https://github.com/rust-lang/crates.io-index --token tokenxxx

输出类似如下就成功了

    Updating crates.io index
   Packaging ipdb_rs v0.1.0 (/home/emacsist/rust/ipdbv4)
   Verifying ipdb_rs v0.1.0 (/home/emacsist/rust/ipdbv4)
    Updating `https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git` index
  Downloaded serde_json v1.0.56 (registry `https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git`)
  Downloaded 1 crate (114.5 KB) in 4.97s
   Compiling proc-macro2 v1.0.18
   Compiling unicode-xid v0.2.1
   Compiling syn v1.0.33
   Compiling serde_derive v1.0.114
   Compiling serde v1.0.114
   Compiling ryu v1.0.5
   Compiling serde_json v1.0.56
   Compiling itoa v0.4.6
   Compiling lazy_static v1.4.0
   Compiling quote v1.0.7
   Compiling ipdb_rs v0.1.0 (/home/emacsist/rust/ipdbv4/target/package/ipdb_rs-0.1.0)
    Finished dev [unoptimized + debuginfo] target(s) in 54.18s
   Uploading ipdb_rs v0.1.0 (/home/emacsist/rust/ipdbv4)

可以看到, 发布的仓库为 https://crates.io/crates/ipdb_rs

https://crates.io/crates/你的包名 , 包名就是在 Cargo.toml 里的

[package]
name = "ipdb_rs"