2 个不稳定版本
0.2.1 | 2023年10月8日 |
---|---|
0.1.0 | 2023年4月8日 |
#164 in Cargo 插件
180KB
4K SLoC
cargo-indicate
这是 indicate 的 cargo 附加组件,提供对其模式和功能的用户友好界面。
安装
要能够查询包及其依赖项的不安全性,您需要安装 cargo-geiger
。为此,只需运行
cargo install cargo-geiger
由于 cargo-geiger
的 --features
标志存在已知问题,它可能不会始终按预期工作。请参阅 rust-secure-code/cargo-geiger 上的问题。
您可以使用以下命令从源安装自定义命令:
cargo install --path . --locked
在此目录中,或从 crates.io 使用
cargo install cargo-indicate
这允许您使用 cargo indicate
调用命令。
注意:对于某些数据源,您可能需要设置一些环境变量。对于 GitHub 和 crates.io,您需要设置 USER_AGENT
。对于 GitHub,您还需要提供 GITHUB_API_TOKEN
。
运行以下命令以获取帮助:
cargo indicate --help # or -h
indicate
库附带一些测试查询,可以与任何包一起使用。例如
$ cargo indicate
> -Q ../indicate/test_data/queries/count_dependencies.in.ron
> --cached-advisory-db # Useful when running concurrent requests, like in tests
> -- ../indicate/test_data/fake_crates/simple_deps
[
{
"dep_name": [],
"name": "libc",
"number": 0
},
{
"dep_name": [
"proc-macro2",
"unicode-ident",
"quote",
"proc-macro2",
"unicode-ident",
"unicode-ident"
],
"name": "syn",
"number": 6
}
]
运行查询
目前有两种运行查询的方式,各有优缺点。最简单的方式是传递一个与 cargo-indicate
模式匹配的 GraphQL(使用 --show-schema
查看它),然后以 JSON 格式传递可能的参数。例如,
$ cargo indicate
> --query '{ RootPackage { name @output @filter(op: "=", value: ["$target"]) } }'
> --args '{ "target": "cargo-indicate" }'
> -- .
[
{
"name": "cargo-indicate",
}
]
两者 -q
/--query
和 -a
/--args
也接受文件路径。您可以通过多个查询和参数集进行传递,并将它们配对。
如果您想要预定义的查询/参数对,可以使用 -Q
/ --query-with-args
和 d
/--query-dir
标志来通过支持的文件格式(推荐使用 .ron
文件,参见[测试查询](/indicate/ indicate/test_data/queries))传递文件。
目标工作区
使用 cargo-indicate
时处理工作区有两种方式
- 传递成员包目录/
Cargo.toml
文件的直接路径 - 使用
--package
标志来指定您感兴趣的包的名称
第一种选项通常更可取,但在自动分析大量包时,如果不知道目标目录是否为工作区,但知道所需的包名称,第二种选项很有用。
选择来源
某些参数会更改某些信号的源数据。例如,--cached-advisory-db
和 --advisory-db-dir
都尝试使用本地目录。
使用包含无安全建议的本地目录(将成功,但始终返回空列表)
$ cargo indicate
> --advisory-db-dir .
> -Q ../indicate/test_data/queries/advisory_db_simple.in.ron
> -- ../indicate/test_data/fake_crates/known_advisory_deps
[]
测试
cargo-indicate
和其底层库 indicate
都针对查询和模拟包进行测试。此处 cargo-indicate
的测试确保 CLI 正如预期那样工作。
它使用 trycmd
。有关更多信息,请参阅 trycmd
文档,但基本思路是测试比较输入和输出。目录 <test-name>.in
是 <test-name>.toml
中定义的命令的根目录,当存在 <test-name>.out
目录时,trycmd
确保在 <test-name>.toml
中运行的命令后,<test-name>.in
和 <test-name.out>
是相同的(然后它们将被重置)。
这是使用 /tmp
文件完成的,因此相对文件将不会像在 <test-name>.in
中实际调用那样工作。
依赖关系
~40–56MB
~1M SLoC