带有数据存储库的C++ Bazel项目

Pic*_*ent 7 c++ bazel

我有一个(基本的)C++项目:

??? bin
?   ??? BUILD
?   ??? example.cpp
??? data
?   ??? someData.txt
??? WORKSPACE
Run Code Online (Sandbox Code Playgroud)

可执行example.cpp使用data/目录中的一些数据文件:

#include <fstream>
#include <iostream>

int main()
{
  std::ifstream in("data/someData.txt");

  if (!in)
  {
    std::cerr << "Can not open file!";
    return EXIT_FAILURE;
  }

  std::string message;

  if (!(in >> message))
  {
    std::cerr << "Can not read file content!";
    return EXIT_FAILURE;
  }

  std::cout << message << std::endl;

  return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

我的Bazel设置是最小的:

  • WORKSPACE:空文件
  • bin/BUILD:cc_binary(name = "example",srcs = ["example.cpp"])
  • data/someData.txt:包含该Hello_world!

问题是Bazel将所有这些文件移动到特殊位置:

.
??? bazel-Bazel_with_Data -> ...
??? bazel-bin -> ...
??? bazel-genfiles -> ...
??? bazel-out -> ...
??? bazel-testlogs -> ...
Run Code Online (Sandbox Code Playgroud)

在特殊情况下,示例可执行文件将找不到data/someData.txt文件:

bazel run bin:example
Run Code Online (Sandbox Code Playgroud)

将打印:

INFO: Analysed target //bin:example (0 packages loaded).
INFO: Found 1 target...
Target //bin:example up-to-date:
  bazel-bin/bin/example
INFO: Elapsed time: 0.101s, Critical Path: 0.00s
INFO: Build completed successfully, 1 total action

INFO: Running command line: bazel-bin/bin/example
Can not open file!ERROR: Non-zero return code '1' from command: Process exited with status 1
Run Code Online (Sandbox Code Playgroud)

问题是如何管理这个?

我希望示例可执行文件能够找到Data/someData.txt文件.

Pic*_*ent 7

注意:这个解决方案似乎在 Windows 下不起作用(请参阅评论)。

\n\n

必须在数据目录中创建一个额外的BUILD文件来定义必须导出哪些数据文件。现在的项目结构是:

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bin\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 BUILD\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 example.cpp\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 data\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 BUILD\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 someData.txt\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 WORKSPACE\n
Run Code Online (Sandbox Code Playgroud)\n\n

这个新的数据/构建文件是:

\n\n
exports_files(["someData.txt"])\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且修改bin/BUILD文件以添加someData.txt依赖项:

\n\n
cc_binary(\n    name = "example",\n    srcs = ["example.cpp"],\n    data = ["//data:someData.txt"],\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在如果你运行:

\n\n
bazel run bin:example\n
Run Code Online (Sandbox Code Playgroud)\n\n

你应该得到:

\n\n
INFO: Analysed target //bin:example (2 packages loaded).\nINFO: Found 1 target...\nTarget //bin:example up-to-date:\n  bazel-bin/bin/example\nINFO: Elapsed time: 0.144s, Critical Path: 0.01s\nINFO: Build completed successfully, 3 total actions\n\nINFO: Running command line: bazel-bin/bin/example\nHello_world!\n
Run Code Online (Sandbox Code Playgroud)\n\n

这意味着示例可执行文件已找到data/someData.txt文件并打印其内容。

\n\n

另请注意,您可以使用相同的方案进行单元测试

\n\n
 cc_test(...,data =["//data:someData.txt"], )\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以从此GitHub 存储库复制此说明。

\n

  • 这不是确定的原因。为了使这些文件通过 bazel run 在 Windows 中打开,我的丑陋解决方法是将“../../../../../../”添加到文件路径:( (2认同)
  • 据我所知,此解决方案仅适用于每个特定文件,但是当规则更通用时, `exports_files(glob(['**']))` - 如何引用整个组?留下路径解析,这对程序来说只是一个黑魔法=( (2认同)