#cargo #package #collect #cargo-subcommand #make #cook

app cargo-cook

一个第三方 Cargo 扩展,允许您处理您的软件包

12 个版本 (1 个稳定版)

1.0.0 2020年2月29日
0.4.2 2020年2月25日
0.4.1 2020年1月15日
0.3.1 2017年4月16日
0.1.5 2017年4月9日

#308Cargo 插件

每月下载量 41 次

MIT/Apache

34KB
636

cargocook

一个第三方 Cargo 扩展,允许您处理您的软件包。它的功能

  1. 收集所有指定的文件(原料)作为与软件包的工件(二进制文件或库)相同的格式。
  2. 将所有内容从 .1 放入一个可能压缩的容器中。
  3. .2 开始为容器计算哈希值。
  4. .3 将所有文件上传到指定位置。

如果您仍然不理解它是做什么的,请阅读下面的内容

在构建软件包后,您将得到一个生成的二进制文件(或库)。您可能希望将其上传到某个地方以供进一步下载和使用。例如,您用纯 Rust 制作了一个名为 rustquake 的游戏。您想发布它,因此以发布模式编译它,启用所有优化,然后您可能想将二进制文件(以及一些其他文件,如配置文件、库、图像、着色器等)上传到某个地方。将所有这些压缩起来也很好。所以,您手动创建一个存档,例如,rustquake-0.1.1.tar.gz,其中您手动放置所有需要的文件。然后您去您的服务器,将存档放在一些您的 web 服务器知道的文件夹中。这是一项非常繁琐的工作。但是所有这些步骤都可以通过 cargo cook 自动完成。

配置

为了使其与您的软件包一起使用,您必须在您的软件包根目录中创建一个名为 Cook.toml 的文件。让我们看看 cargo-cook 软件包的 Cook.toml.example 示例

[cook]
target_directory = "target/release"
target_rename = "cargocook"
hashes = ["md5", "sha256", "sha512"]
containers = ["tar", "tar.bzip2"]
pre_cook = "pre_cook.sh"
post_cook = "post_cook.sh"
include_dependencies = true
cook_directory = "cooked/"

[cook.deploy]
targets = ["fscopy", "ssh"]

[cook.deploy.fscopy]
path = "/tmp"

[cook.deploy.ssh]
hostname = ""                           # Host:port format.
username = ""
remote_path = ""                        # must be absolute path!
deploy_script = "ssh_deploy.sh"         # Will be executed on remote server.


# If source is a file then it will be copied to the destination.
# If the source is a directory then the destination field is also a directory and `filter` field can be used to determine which files to take.
[[cook.ingredient]]
source = "Cargo.toml"
destination = "Cargo.toml"

[[cook.ingredient]]
source = "src"
destination = "src"

[[cook.ingredient]]
source = "./"
filter = "(LICENSE-*)"
destination = "licenses/"

cook

  • target_directory - 一个用于查找您的软件包工件(artifacts)的目录。
  • target_rename (可选) - 在将目标文件打包到容器之前重命名目标文件。
  • hashes (可选) - 用于计算容器哈希值的哈希算法列表。
  • containers - 你要装填原料的容器列表。
  • pre_cook (可选) - 在烹饪前执行的脚本。
  • post_cook (可选) - 在烹饪后执行的脚本。
  • include_dependencies (可选) - 将crate依赖包含到容器中。
  • cook_directory - 容器将被放入的目录。

部署

  • targets - 部署目标列表。

deploy.fscopy

  • path - 要复制烹饪文件的字符串。

deploy.ssh

  • hostname - 包含主机名和端口的字符串(例如:github.com:80)。
  • username - 用于部署的用户名。部署期间会询问密码。
  • remote_path - 指向远程路径的字符串,烹饪文件将复制到此路径。
  • deploy_script (可选) - 在远程服务器上执行,将 remote_path 作为工作目录的字符串。

原料

  • source - 字符串,是文件或目录的路径。如果是目录,则可以使用 filter 字段。
  • filter (可选) - 用于确定原料的正则表达式。
  • destination - 字符串,是文件或目录的路径。如果 source 是文件,则 destination 也是文件;否则,它是 source 目录中文件的存放目录。

因此,如果你只在包含 cargo cook crate 的目录中执行 cargo cook,则它将给出

$ cd cargo-cook

$ cargo cook
  Cooking cargo-cook v0.1.5
  Executing Pre-cook
  Hello from pre_cook.sh
  Pre-cook returned 0
  Cooked /home/workspace/cargo-cook/cooked/cargo-cook-0.1.5.tar
  Executing Post-cook
  Hello from post_cook.sh
  Post-cook returned 0
  Finished cooking

$ ls cooked/
  cargo-cook-0.1.5.tar
  cargo-cook-0.1.5.tar.md5
  cargo-cook-0.1.5.tar.sha256
  cargo-cook-0.1.5.tar.sha512

$ tar -xvf cargo-cook-0.1.5.tar
  Cargo.toml
  src/main.rs
  src/container.rs
  src/hash.rs
  licenses/LICENSE-APACHE
  licenses/LICENSE-MIT
  cargocook

编译

假设你已经设置了 Rust 和 cargo。

克隆此存储库并进入创建的目录

git clone https://github.com/vityafx/cargo-cook.git
cd cargo-cook

并编译一个发布版本

cargo build --release

现在你应该在 [起始目录]/cargo-cook/target/release/cargo-cook 中有一个可执行文件。

安装和使用

按照上一节所示编译代码,然后将 cargo-cook 可执行文件放入你的 PATH。

我最喜欢的做法是在 ~/bin 中有一个现有的目录,其中包含我的一些小脚本,该目录添加到我的 .bashrc,这样它总是可用,然后我从发布版本所在的位置创建到该目录的符号链接

ln -s [starting directory]/cargo-cook/target/release/cargo-cook ~/bin/

完成这些后,由于 cargo 设置为使用第三方扩展,因此在你自己的任何其他 Rust 项目中,你应该能够运行

cargo cook

然后那个 crate 将被烹饪。

有一个选项可以指定配方文件的非默认文件名(默认为 Cook.toml

cargo cook -r MyCustomRecipe.toml

这样你也可以使用不同的配方调用 cargo cook

cargo cook -r MyCustomRecipeForLinux.toml
cargo cook -r MyCustomRecipeForWindows.toml

贡献

如果您想独立工作在代码版本上,请 fork 这个仓库,并按照上述步骤进行编译,但使用您的 fork。

如果您直接运行二进制文件而不是通过 cargo 插件系统,会发现一个奇怪的现象,那就是 clap 认为您没有使用子命令。如果您尝试这样做,您将得到

$ ./target/release/cargo-cook whatever
error: Found argument 'whatever', but cargo wasn't expecting any

USAGE:
        cargo <SUBCOMMAND>

For more information try --help

为了解决这个问题,您可以选择按照上面的安装和用法说明操作,并始终使用 cargo cook whatever,或者重新指定 cook 作为子命令

./target/release/cargo-cook cook whatever

许可证

cargo cook 主要在 MIT 许可证和 Apache 许可证(版本 2.0)的条款下分发。

有关详细信息,请参阅 LICENSE-APACHE 和 LICENSE-MIT。

依赖项

~8–20MB
~261K SLoC