#graphql #graphql-schema #cargo #search #dependencies #directory #cli

app cargo-indicate

用于在 Rust 依赖树上运行 GraphQL 查询的库

2 个不稳定版本

0.2.1 2023年10月8日
0.1.0 2023年4月8日

#164 in Cargo 插件

MIT/Apache

180KB
4K SLoC

Rust 3K SLoC // 0.0% comments Rusty Object Notation 429 SLoC // 0.0% comments GraphQL 186 SLoC // 0.2% comments

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-argsd/--query-dir 标志来通过支持的文件格式(推荐使用 .ron 文件,参见[测试查询](/indicate/ indicate/test_data/queries))传递文件。

目标工作区

使用 cargo-indicate 时处理工作区有两种方式

  1. 传递成员包目录/Cargo.toml 文件的直接路径
  2. 使用 --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