External tools

外部工具

Cargo 的目标之一是与第三方工具(如 IDE 和其他构建系统)的简单集成。为了简化集成,Cargo 有几个设施:

  • 一个cargo metadata命令,以 JSON 格式输出包结构和依赖关系信息,

  • 一个--message-format标志,输出有关特定构建的信息,以及

  • 支持自定义子命令.

Information about package structure

包结构的资料

您可以使用cargo metadata命令,以获取有关包结构和依赖关系的信息。命令的输出如下所示:

{
              // Integer 版本格式数字.
              "version": integer,
            
              // 工作区包的列表, 包括 依赖项.
              "packages": [
                {
                  // 包 识别id 队列.
                  "id": PackageId,
            
                  "name": string,
            
                  "version": string,
            
                  "source": SourceId,
            
                  // 确认依赖的一个列表, 可看 `resolve` 字段中的真实依赖.
                  "dependencies": [ Dependency ],
            
                  "targets: [ Target ],
            
                  //  Cargo.toml 路径
                  "manifest_path": string,
                }
              ],
            
              "workspace_members": [ PackageId ],
            
              // 依赖 关系图.
              "resolve": {
                 "nodes": [
                   {
                     "id": PackageId,
                     "dependencies": [ PackageId ]
                   }
                 ]
              }
            }
            

格式稳定且有版本化。调用cargo metadata时,你应该通过--format-version明确标记,以避免向前不兼容的危险。

如果你正在使用 Rust,这有个cargo_metadata箱.

Information about build

关于构建的资料

传递--message-format=json给,Cargo, 将在构建期间输出以下信息:

  • 编译器错误和警告,

  • 制作的工件,

  • 构建脚本的结果(例如,本机依赖项).

输出以每行格式的 JSON 对象转到 stdout。reason字段区分不同类型的消息.

有关 Makefile 兼容格式的依赖关系的信息存储在工件旁的.d文件中。

Custom subcommands

自定义的子命令

Cargo 设计为,可以使用新的子命令进行扩展,而无需修改 Cargo 本身。这是通过转化一个 cargo (?<command>[^ ]+)的命令调用,变化为调用外部工具cargo-${command}来实现的。外部工具必须存在于用户其中一个$PATH目录中.

当 Cargo 调用自定义子命令时,子命令的第一个参数将像往常一样是自定义子命令的文件名。第二个参数将是子命令名称本身。例如,在调用cargo-${command}时,第二个参数是${command}。命令行上的其他所有参数将保持不变.

Cargo 还可以用cargo help ${command}显示自定义子命令的帮助输出。Cargo 假定子命令将在第三个参数出现时,打印帮助消息--help.所以,cargo help ${command}会调用cargo-${command} ${command} --help.

自定义子命令可以使用CARGO环境变量回调 Cargo。或者,它可以链接到作为一个库的cargo箱,但这种方法有缺点:

  • Cargo 作为库是不稳定的:API 可能会更改,但不会弃用

  • 链接的 Cargo 库的版本可能与 Cargo 二进制文件不同