繁体   English   中英

在使用Bazel构建的应用程序中访问运行时文件

[英]Access runtime files in application built with Bazel

我正在尝试使用Bazel构建C ++应用程序,该程序在运行时需要大量文件。 我使用构建规则的data属性将这些文件包括在构建目标中:

cc_binary(
  name = "myapp",
  srcs = [
    "main.cpp",
  ],
  data = glob([ "media/**" ], exclude = [ "media/BUILD", "media/.keep" ]),
)

问题在于,Bazel将运行文件放在一个奇怪的路径下,即依赖于构建系统的目录( <build target name>.runfiles/__main__/<build target name>/ )。

除了像这样硬编码这些路径之外,是否有任何其他理智的(或灵活的,如果您愿意的话)方式来引用运行文件

// "myapp" is the build target name
FILE* f = fopen("myapp/myapp.runfiles/__main__/myapp/media/file.txt", "r");

还是从清单中读取路径(这不是更好的选择,因为每个文件都以__main__/<build target name>/为前缀)?

除了像这样硬编码这些路径之外,是否有任何其他理智的(或灵活的,如果您愿意的话)方式来引用运行文件

还没。 但是我们正在努力。

有关设计文档和进度,请参见https://github.com/bazelbuild/bazel/issues/4460

除了László的设计文档答案之外,您还可以尝试以下几种方法:

  1. 使用args属性告诉二进制文件在哪里。 仅当您通过bazel run运行二进制文件并且要求二进制文件理解这些标志时,这才起作用。

  2. 使用包含所需文件路径的风格创建清单。 清单将位于已知位置,因此您可以在运行时阅读该清单。

您可以在此处看到一些示例(它们用于Java,但对于cc规则应该相似):

https://groups.google.com/d/topic/bazel-discuss/UTeGdXjO_lQ/discussion

另一种选择是使用类似pkg_tar或类似规则的东西,将二进制文件及其运行文件重新打包为所需的任何结构: https ://docs.bazel.build/versions/master/be/pkg.html(据我所知,pkg_tar不会打包二进制文件的运行文件。)

看起来Bazel 0.15 添加了对所谓的Rlocation支持,它允许通过在代码中添加此类来循环运行时文件:

  1. 依赖于您的构建规则中的以下runfiles库:

     cc_binary( name = "my_binary", ... deps = ["@bazel_tools//tools/cpp/runfiles"], ) 
  2. 包括运行文件库。

     #include "tools/cpp/runfiles/runfiles.h" using bazel::tools::cpp::runfiles::Runfiles; 
  3. 创建一个Runfiles对象并使用Rlocation查找运行文件路径:

     int main(int argc, char** argv) { std::string error; std::unique_ptr<Runfiles> runfiles(Runfiles::Create(argv[0], &error)); // Important: // If this is a test, use Runfiles::CreateForTest(&error). // Otherwise, if you don't have the value for argv[0] for whatever // reason, then use Runfiles::Create(&error). if (runfiles == nullptr) { // error handling } std::string path = runfiles->Rlocation("my_workspace/path/to/my/data.txt"); // ... } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM