如何获取 Bazel 执行的命令

Posted

技术标签:

【中文标题】如何获取 Bazel 执行的命令【英文标题】:How do I get the commands executed by Bazel 【发布时间】:2015-11-29 14:09:32 【问题描述】:

我想知道是否有办法让 Bazel 列出、输出、显示等所有可以从命令行执行的命令,这些命令在清理后的构建期间运行。我不在乎输出是在屏幕上还是在文件中等等。如有必要,我会将其按摩成可用的形式。

我在运行 Bazel 期间捕获了屏幕输出,这让我知道正在做什么,但是它没有给我一个可以在命令行上执行的命令。该命令必须包含所有命令选项,而不是显示变量。

如果这是不可能的,因为 Bazel 是开源的,在代码中是/是代表要运行的命令的行,以便我可以修改 Bazel 以输出可执行命令。

我知道 Bazel 中的查询命令,并使用它生成依赖关系图。如果这可以作为查询命令完成,那就更好了。

TLDR;

我的目标是在 Windows 上使用 Bazel 构建 TensorFlow。是的,我知道所有不这样做的问题和原因,并且已经通过虚拟机或 Docker 在 Windows 上成功安装了 TensorFlow。我确实从 Cygwin 开始尝试在 Windows 上构建 Bazel,但这开始失控,因为我习惯于使用软件包进行安装,而 Cygwin 不适合使用软件包,所以我开始尝试手动构建 Bazel这变成了一个泥潭。因此,我现在尝试通过复制 Bazel 在 Linux 上构建 TensorFlow 所做的工作,在 Windows 上手动构建 TensorFlow。

【问题讨论】:

您是否考虑或尝试使用 WSL 代替 Cygwin 或 Docker 或 VM? @BrianBulkowski 当这个问题在 2015 年提出时,我不相信 WSL 是公开的。我确实在 beta 版本的早期使用了 WSL,即使那样它也没有访问 GPU,所以在提出问题时我不会考虑 WSL 1。虽然我仍然密切关注 TensorFlow 的使用,但目前我并没有积极使用 TensorFlow,而是将其保存在我的工具箱中。 :) 幸运的是,我当时所做的事情的细节在这个答案中被公开了,但它也是多年前完成的。虽然我最近没有安装 TensorFlow,但我现在先尝试标准安装。 幸运的是,我当时所做的事情的详细信息已在 answer 中公开,但它也是多年前完成的。虽然我最近没有安装 TensorFlow,但我现在先尝试标准安装。 @BrianBulkowski 发现 Aerospike,我喜欢引擎概念,但 NoSQL 数据库公司的名字很奇怪,加入论坛,:) 如果数字合理,Elon 会考虑使用 Aerospike 引擎。 【参考方案1】:

你是对的,你可以使用-s (--subcommands) 选项:

bazel build -s //foo

见https://docs.bazel.build/versions/master/user-manual.html#flag--subcommands。

对于您的用例,您可能希望将输出重定向到文件,然后将任何库/二进制路径全局替换为 Windows 等效项。

您可能想要跟踪 https://github.com/bazelbuild/bazel/issues/276(Windows 支持),尽管可能需要一段时间。

【讨论】:

【参考方案2】:

(免责声明:此解决方案打印当前得到执行的命令,但将得到得到 执行。)

我会使用aquery(action graph query)(忘记“graph”):

bazel aquery //foo

优点:

速度非常快,因为它在不执行构建的情况下打印操作。 这是一个查询。它没有副作用。 您无需先发送bazel clean 即可了解已构建库的构建步骤。 它会打印有关您请求的特定构建步骤的信息。它确实打印依赖项所需的所有构建命令。

【讨论】:

以上是关于如何获取 Bazel 执行的命令的主要内容,如果未能解决你的问题,请参考以下文章

Bazel简介:构建C ++项目

如何获取使用 Testcontainers 执行的命令退出代码?

bash shell如何获取到命令执行结果的值?

C或C++如何通过程序执行shell命令并获取命令执行结果?

python如何实时获取命令行执行的输出

如何:在 C# 中执行命令行,获取 STD OUT 结果