命令行总结
作为使用工作空间的一部分,Cargo 执行功能统一:https://doc.rust-lang.org/cargo/reference/features.html#feature-unification
这意味着什么?
假设您有一个工作空间
[ workspace ]
members = [ " mega " , " potato " ]
拥有两名成员: mega
[ package ]
name = " mega "
[ dependencies ]
potatoer = { version = " 0.2.1 " , features = [ " mega " ] }
还有potato
[ package ]
name = " potato "
[ dependencies ]
potatoer = { version = " 0.2.1 " , features = [ " potato " ] }
两者都依赖于一个常见的第三方potatoer
但具有不同的功能: mega
对"mega"
功能感兴趣, potato
对"potato"
功能感兴趣。
当运行不同的命令时,您最终需要几个不同版本的potatoer
crate。
整个工作区命令将使用具有统一功能的版本:
cargo check # this will use potatoer with both "mega" and "potato"
在单个 crate 上运行的命令将使用不统一的版本:
cargo check -p mega # this will use potatoer with "mega" feature
cargo check -p potatoer # this will use potatoer with "potato" feature
cargo check -p mega -p potato # this will require both "mega" and "potato"
如果不存在具有所需组合的依赖项 - Cargo 将对其进行编译。
避免此问题的一种方法是确保工作区的成员是否依赖于一个 crate - 他们依赖于它具有相同的功能集。手动维护很容易出错,这时候就需要hackerman hack
和hackerman restore
了。
当与--lock
选项一起使用时, hackerman
将获取所有依赖项的校验和,并将其保存在["package.metadata.hackerman.lock"]
下的Cargo.toml
文件中,后续调用检查将确认此校验和仍然有效。
这是为了确保保存原始(未破解的)依赖项并可以在以后恢复。
可以在定义工作区的Cargo.toml
文件中对--lock
选项进行硬编码:
[ workspace . metadata . hackerman ]
lock = true
目前,仅针对当前目标执行统一,没有交叉编译支持。如果您使用与版本或{}
不同的语法指定依赖项,则工作区 toml 文件的自动更新可能不起作用:
potato = " 3.14 " # this is okay
banana = { version = " 3.14 " } # this is also okay
解决由 hackerman 更改的Cargo.toml
文件的合并和变基冲突
要使用它,你需要这样的东西
全局.gitconfig
或本地.git/config
。
[merge "hackerman"]
name = merge restored files with hackerman
driver = cargo hackerman merge %O %A %B %P
gitattributes
文件,可以是每个项目的本地文件或全局文件
Cargo.toml merge=hackerman
要创建全局gitattributes
文件,您需要在全局 git 配置中指定它的路径:
[core]
attributesfile = ~/.gitattributes
在这里,我比较了不同的统一方法对工作空间的影响。在没有任何更改的情况下,对整个工作区进行彻底检查(涉及编译所有外部依赖项)需要 672 秒。
工作区包含一堆板条箱,我从中选择了板条箱a
、 b
、 c
等,这样板条箱b
导入板条箱a
,板条箱c
导入板条箱b
等。板条箱a
不包含外部依赖项,其他板条箱不包含外部依赖项。
cargo hackerman hack
命令生成的,并且新的依赖项被添加到每个板条箱中在运行命令之前,我先清理编译结果,然后按顺序清理每列的命令
命令 | 没有黑客 | 黑客人 | 手动破解 |
---|---|---|---|
check -pa | 0.86秒 | 0.80秒 | 215.39秒 |
check -pb | 211.30秒 | 240.15秒 | 113.56秒 |
check -pc | 362.69秒 | 233.38秒 | 176.73秒 |
check -pd | 36.16秒 | 0.24秒 | 0.25秒 |
check -pe | 385.35秒 | 66.34秒 | 375.22秒 |
check | 267.06秒 | 93.29秒 | 81.50秒 |
全部的 | 1263.42 | 634.20 | 962.65 |
cargo hackerman
↴cargo hackerman hack
↴cargo hackerman restore
↴cargo hackerman check
↴cargo hackerman merge
↴cargo hackerman explain
↴cargo hackerman dupes
↴cargo hackerman tree
↴cargo hackerman show
↴ 帮助您的工作区快速编译的工具集合
用法: cargo hackerman
COMMAND ...
可用选项:
-h
, --help
— 打印帮助信息-V
, --version
— 打印版本信息可用命令:
hack
— 统一工作区中各个 crate 之间的 crate 依赖关系restore
- 删除由hack
命令添加的板条箱依赖统一check
— 检查是否需要统一以及校验和是否正确merge
— 恢复文件并使用默认合并驱动程序合并explain
——解释为什么存在某种依赖性。功能和版本都是可选的dupes
— 列出工作区中的所有重复项tree
— 根据依赖关系创建一棵树show
— 显示板条箱清单、自述文件、存储库或文档您可以通过--help
两次以获得更详细的帮助
统一工作区中各个 crate 之间的 crate 依赖关系
用法: cargo hackerman
hack
CARGO_OPTS
[ --dry
] [ --lock
] [ -D
]
您可以使用cargo hackerman restore
撤消这些更改。
货物选择:
--manifest-path
= PATH
— Cargo.toml 文件的路径--frozen
— 要求 Cargo.lock 和缓存是最新的--locked
— 要求 Cargo.lock 是最新的--offline
— 不访问网络即可运行-v
, --verbose
— 增加详细程度,可以使用多次可用选项:
--dry
— 不执行操作,只显示它
--lock
— 将依赖项校验和包含到存储中
这有助于确保您可以返回到原始(未破解的)依赖项:为了能够恢复原始依赖项,黑客需要将它们隐藏在Cargo.toml
文件中。如果 CI 检测到校验和不匹配,则意味着对被黑源的依赖项已更新。相反,您应该恢复它们、更新并再次破解。
您可以通过将其添加到工作区中的Cargo.toml
来设置锁定默认行为
[workspace.metadata.hackerman]
lock = true
-D
, --no-dev
— 不统一开发依赖
-h
, --help
— 打印帮助信息
cargo-hackerman hack
计算并向所有工作区成员添加一组最小的额外依赖项,以便当该板条箱用作整个工作区的一部分或单独使用时,该板条箱的所有依赖项的功能保持不变。
一旦依赖项被黑客攻击,您应该在进行任何更改之前恢复它们。
删除hack
命令添加的 crate 依赖统一
用法: cargo hackerman
restore
CARGO_OPTS
[ TOML
]...
货物选择:
--manifest-path
= PATH
— Cargo.toml 文件的路径--frozen
— 要求 Cargo.lock 和缓存是最新的--locked
— 要求 Cargo.lock 是最新的--offline
— 不访问网络即可运行-v
, --verbose
— 增加详细程度,可以使用多次可用的位置项目:
TOML
— 恢复单个文件而不是整个工作区可用选项:
-h
, --help
— 打印帮助信息检查是否需要统一以及校验和是否正确
与cargo-hackerman hack --dry
类似,但也将退出状态设置为 1,以便您可以将其用作 CI 流程的一部分
用法: cargo hackerman
check
CARGO_OPTS
[ -D
]
货物选择:
--manifest-path
= PATH
— Cargo.toml 文件的路径--frozen
— 要求 Cargo.lock 和缓存是最新的--locked
— 要求 Cargo.lock 是最新的--offline
— 不访问网络即可运行-v
, --verbose
— 增加详细程度,可以使用多次可用选项:
-D
, --no-dev
— 不统一开发依赖-h
, --help
— 打印帮助信息恢复文件并使用默认合并驱动程序合并
用法: cargo hackerman
merge
BASE
LOCAL
REMOTE
RESULT
可用选项:
-h
, --help
— 打印帮助信息要使用它,您可以将类似的内容添加到~/.gitconfig
或.git/config
[merge "hackerman"]
name = merge restored files with hackerman
driver = cargo hackerman merge %O %A %B %P
和.git/gitattributes
类似
Cargo.toml merge=hackerman
解释为什么存在某种依赖性。功能和版本都是可选的
用法: cargo hackerman
explain
CARGO_OPTS
[ -T
] [ -P
] [ -s
] CRATE
[ FEATURE
] [ VERSION
]
货物选择:
--manifest-path
= PATH
— Cargo.toml 文件的路径--frozen
— 要求 Cargo.lock 和缓存是最新的--locked
— 要求 Cargo.lock 是最新的--offline
— 不访问网络即可运行-v
, --verbose
— 增加详细程度,可以使用多次可用选项:
-T
, --no-transitive-opt
— 不要删除冗余链接-P
, --package-nodes
— 使用包节点而不是功能节点-s
, --stdout
— 将点文件打印到标准输出而不是生成xdot
-h
, --help
— 打印帮助信息由于存在大量依赖项,可能很难判断为什么包含某些子子子依赖项。 hackerman 解释通过跟踪从目标到工作区的依赖链解决了这个问题。
explain
从给定的板条箱/功能开始,并遵循反向依赖链接,直到到达与工作区的所有交叉点,但不进入工作区本身。
白色节点代表工作区成员,圆形节点代表特征,八角形节点代表基础板条箱。虚线代表仅开发依赖项,虚线代表开发版和普通版,但具有不同的功能。目标通常会突出显示。默认情况下,hackerman 扩展可以使用-P
恢复的包信息功能节点,并尝试减少传递依赖性以保持树更具可读性 - 这可以使用-T
恢复。
如果一个板条箱存在多个版本,您可以指定您感兴趣的版本,但它是可选的。
您还可以指定要查找的功能,否则黑客将查找所有功能。
列出工作区中的所有重复项
用法: cargo hackerman
dupes
CARGO_OPTS
货物选择:
--manifest-path
= PATH
— Cargo.toml 文件的路径--frozen
— 要求 Cargo.lock 和缓存是最新的--locked
— 要求 Cargo.lock 是最新的--offline
— 不访问网络即可运行-v
, --verbose
— 增加详细程度,可以使用多次可用选项:
-h
, --help
— 打印帮助信息从依赖关系中创建一棵树
用法: cargo hackerman
tree
CARGO_OPTS
[ -T
] [ -D
] [ -P
] [ -w
] [ -s
] [ CRATE
] [ FEATURE
] [ VERSION
]
货物选择:
--manifest-path
= PATH
— Cargo.toml 文件的路径--frozen
— 要求 Cargo.lock 和缓存是最新的--locked
— 要求 Cargo.lock 是最新的--offline
— 不访问网络即可运行-v
, --verbose
— 增加详细程度,可以使用多次可用选项:
-T
, --no-transitive-opt
— 不要删除冗余链接-D
, --no-dev
— 不包含开发依赖项-P
, --package-nodes
— 使用包节点而不是功能节点-w
, --workspace
— 保留在工作空间内-s
, --stdout
— 将点文件打印到标准输出而不是生成xdot
-h
, --help
— 打印帮助信息示例:
cargo hackerman tree rand 0.8.4
cargo hackerman tree serde_json preserve_order
显示包清单、自述文件、存储库或文档
用法: cargo hackerman
show
CARGO_OPTS
[ -m
| -r
| -d
| -R
] CRATE
[ VERSION
]
货物选择:
--manifest-path
= PATH
— Cargo.toml 文件的路径--frozen
— 要求 Cargo.lock 和缓存是最新的--locked
— 要求 Cargo.lock 是最新的--offline
— 不访问网络即可运行-v
, --verbose
— 增加详细程度,可以使用多次可用选项:
-m
, --manifest
— 显示板条箱清单-r
, --readme
— 显示箱自述文件-d
, --doc
— 打开文档 URL-R
, --repository
— 存储库-h
, --help
— 打印帮助信息示例:
cargo hackerman show --repository syn