#publish #workspace #cargo #all

bin+lib cargo-publish-all

发布所有包的工具

9 个版本 (4 个破坏性更新)

0.5.3 2019 年 6 月 16 日
0.5.2 2019 年 6 月 16 日
0.5.1 2018 年 12 月 30 日
0.4.1 2018 年 12 月 26 日
0.1.0 2018 年 12 月 23 日

#428 in Cargo 插件

40 每月下载量
jito-solana-account-decod… 中使用

MIT/Apache

26KB
539

cargo-publish-all

coverage license crate

自行承担风险。

此工具扫描当前工作区,将每个包都构建成已发布的样子,并将尚未在 crates.io 上存在的包发布出去。如果验证失败,它将停止。

验证分为两个阶段

  1. 包 & 规范化所有包;将即将发布的 crate 的版本依赖替换为路径,并尝试构建每个包。
  2. 如果第一次遍历成功,则按正确顺序发布所有包。这将在第二次验证,理论上不应该失败。然而,安全总是更好的。

如果仅在第二个阶段检测到错误(不应该发生),则一半的工作区将被发布(并成功构建),另一半则不会在 crates.io 上。这肯定比在 crates.io 上有损坏的包要好。

用法

cargo install cargo-publish-all
cargo-publish-all

请注意,您需要通过输入 "y" 确认 "发布计划"。如果您不希望这样做,请指定 --yes

cargo-publish-all --yes

由于此工具仍处于早期阶段,它可能不会始终按预期工作。因此,您可以使用 --dry-run 确保它按预期运行,而不向 crates.io 推送

cargo-publish-all --dry-run

注意: 这对于第二个 crate 总是会失败,这是一个已知问题。尽管如此,您仍然可以看到它将执行的操作。这将在未来得到改进。

显示更多输出

默认情况下,cargo-publish-all 会隐藏所有输出,只显示错误和高层次的状态消息,因为输出将变得相当大。您可以使用 --verbose 标志更改此设置。

Docker

有一个用于 cargo-publish-all 的 Docker 镜像。您可以使用以下方式访问

registry.gitlab.com/torkleyy/cargo-publish-all

GitLab CI

请注意,您应该定义一个环境变量 CRATES_IO_TOKEN(并保护它!)。

crates.io:
  image: registry.gitlab.com/torkleyy/cargo-publish-all:latest
  stage: deploy
  script:
  - cargo-publish-all --token $CRATES_IO_TOKEN --yes
  only: 
    refs:
    - master

这将允许所有具有写入权限的人触发向 crates.io 的推送。 请注意,秘密变量未进行掩码,可以通过合并更改后的脚本泄露。

帮助

cargo-publish-all --help
cargo-publish-all 0.2
Thomas Schaller <torkleyy@gmail.com>
Upload workspace packages to crates.io

USAGE:
    cargo-publish-all [FLAGS] [OPTIONS]

FLAGS:
        --allow-dirty      Allow dirty working directories to be packaged
        --dry-run          Perform all checks without uploading
    -h, --help             Prints help information
        --manifest-path    Path to Cargo.toml
    -V, --version          Prints version information
        --verbose          Show more output
        --yes              Confirm publishing without interaction

OPTIONS:
        --token <TOKEN>    Token to use when uploading

示例输出

$ cargo-publish-all     
   Resolving workspace
    Fetching crates.io versions
Skipping crate `nitric-lock-internals`, version already published
Skipping crate `nitric`, version already published
   Verifying workspace
   Verifying nitric-lock-internals
   Verifying nitric-lock
   Verifying nitric
Summary:
nitric-lock-internals: 0.0.1 (skipped)
nitric-lock: 0.0.1
nitric: 0.0.1 (skipped)
Continue? [y/N] y
  Publishing workspace
    Skipping nitric-lock-internals
  Publishing nitric-lock
    Skipping nitric

行为

高级行为可以描述如下

发布当前工作区中所有未发布的crate,前提是当从crates.io拉取时,工作区的所有成员都会构建。

这意味着您可以在CI上简单地运行它,一旦版本号增加,它就会发布crate。

示例案例

注意:以下属性应在未来进行测试

  • 再次执行 cargo-publish-all 应该没有影响
  • cargo-publish-all 对于单crate工作区等同于 cargo publish

待办事项

  • 适当的日志记录,不要使用 println!
  • 展示版本是如何增加的 (0.1.2 -> 0.1.3)
    • 增加旧版本(如何显示?)
  • 尝试将其合并到Cargo中
    • 可能过于主观?
    • cargo-publish-all 是幂等的,cargo publish 则不是

依赖

~65MB
~1.5M SLoC