我正在尝试从工作区根目录使用 bazel run
命令运行
bazel目标。我想将相对路径作为参数传递给该目标。目前它无法识别此通道,而从控制台手动运行则可以正常工作。
所以我得出结论,此时 bazel 的工作目录与工作空间根目录不同。
我检查了 bazel 文档、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 run
在其运行文件树中执行二进制文件,并且官方没有办法更改它。如果这是一个问题,可能的解决方案:
bazel run
;直接执行二进制文件。bazel run
将执行的工作目录放入 $BUILD_WORKING_DIRECTORY
环境变量中,因此二进制文件可以根据需要解析相对于该路径的路径。bazel run --run_under="cd $PWD &&" //some:target
如果您正在使用
sh_binary
那么您可以使用如下脚本来解决此问题:
#!/bin/bash
set -e
LAUNCH_WORKING_DIRECTORY=$(pwd)
if test "${BUILD_WORKING_DIRECTORY+x}"; then
cd $BUILD_WORKING_DIRECTORY
fi
$LAUNCH_WORKING_DIRECTORY/tool.sh "${@:1}"
sh_binary(
name = "tool",
srcs = [ "launcher.sh" ],
data = [ "tool.sh" ],
)
必须说,Bazel 让事情变得异常复杂。