Bazel + C++ 项目:如何为“运行”命令指定工作目录
Posted
技术标签:
【中文标题】Bazel + C++ 项目:如何为“运行”命令指定工作目录【英文标题】:Bazel + C++ project: how to specify working directory for 'run' command 【发布时间】:2022-01-12 07:47:24 【问题描述】:我正在尝试使用来自工作区根目录的 bazel run
命令运行 bazel 目标。我想将相对路径作为参数传递给这个目标。目前它无法识别此通行证,而从控制台手动运行可以正常工作。
所以我得出结论,此时 bazel 的工作目录与工作区根目录不同。
我检查了 bazel docs、google,但没有找到明确的方法来指定运行命令的工作目录。有人知道这样做的正确方法吗?谢谢!
附: 即我正在尝试运行mediapipe iris example,我使用以下命令(从项目根目录)构建它:
bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/iris_tracking:iris_tracking_cpu
然后,如果我手动运行它(也从项目根目录),它工作正常:
GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/hand_tracking/hand_tracking_gpu --calculator_graph_config_file=mediapipe/graphs/hand_tracking/hand_tracking_mobile.pbtxt
现在如果我用bazel run
运行它会失败:
bazel run -c dbg --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/iris_tracking:iris_tracking_cpu -- --calculator_graph_config_file=mediapipe/graphs/iris_tracking/iris_tracking_cpu.pbtxt
不是,在图形路径前使用 $PWD
并没有帮助,因为 mediapipe 引擎仍然依赖于相对路径和正确的 CWD 值。
【问题讨论】:
我已经建立了简单的 bazel 应用程序,可以打印当前目录。我打印我以下内容:“/private/var/tmp/_bazel_stepan/5fb8b1321583495e8a465a1758c5a8e4/execroot/__main__/bazel-out/darwin-fastbuild/bin/main/hello-world.runfiles/__main__” ...哦...这个是我一直认为的工作目录(讽刺)。 一段时间后,我发现了以下内容。 Bazel 使用“沙盒”的东西。因此......每当您运行“bazel run”时,它都会在半隔离沙箱中运行文件(他们使用术语“hermetic”运行)。并且可以通过将特殊标签传递给构建规则来以某种方式禁用沙箱。目前我正在尝试使用“no-sandbox”,但似乎你必须清理它,否则它仍然使用沙盒。 好吧,我在“cc_binary”规则中定义了以下内容:'tags = ["no-sandbox", "no-cache", "no-remote"]'....没有帮助。到目前为止还没有想法。 您可以将程序包装在一个 sh_binary 中,该程序将工作目录作为第一个 arg(并且 cd 在那里)并将其余部分传递给您定义为数据 dep 的程序。 【参考方案1】:bazel run
在其运行文件树中执行二进制文件,there is official no way to change that。如果这是一个问题,可能的解决方案:
bazel run
;直接执行二进制文件。
bazel run
将执行它的工作目录放在 $BUILD_WORKING_DIRECTORY
环境变量中,因此二进制文件可以根据需要解析与该目录相关的路径。
在具有 POSIX shell 的平台上,有一个 hacky 解决方法:bazel run --run_under="cd $PWD &&" //some:target
【讨论】:
以上是关于Bazel + C++ 项目:如何为“运行”命令指定工作目录的主要内容,如果未能解决你的问题,请参考以下文章