在将现有构建迁移到bazel的过程中,我有一个子模块mod1,它具有从"testdata“目录读取文件的一些JUnit测试。在尝试加载这些文件时,我必须使用“mod1 1/testdata/test.txt”而不是"testdata/test.txt",即单元测试必须知道它们相应的bazel模块目录。
(1)这是bazel 0.23.2@debian和0.23.2-自制的正确行为吗?
(2)是否有一种方法可以不改变地使用.java测试,并消除bazel / for文件中对"mod1“前缀的需求?
我的示例项目在这里:https://gitlab.com/jhinrichsen/bazel-data-test。我正在寻找一种对根模块和子模块使用相同路径"testdata/test.txt“的方法。在我的示例项目中,bazel test AllTests
成功,而bazel test mod1/AllTests
失败是因为我需要将“mod1 1/”添加到"testdata/test.txt“。
不寻找基于资源/类路径的解决方案,因为我不能修改现有的测试源。
发布于 2019-03-25 11:26:52
您所看到的行为确实是正确的行为,并且无法用本机mod1规则删除“”前缀。您在data
中包含的任何内容都将以您所看到的方式限定在它自己的包中。
这样做的原因很简单。假设您的测试目标//mod1:AllTests
也依赖于一个假设的//mod2:tests
库。假设库也有一个testdata/test.txt
作为数据依赖项。除非将多个test.txt
文件命名为包的空间,否则它们将发生冲突。
如果您完全不能修改测试源,那么您就几乎被困住了。下面是之前对此的讨论:https://groups.google.com/forum/#!topic/bazel-discuss/w6TDwSZvN0k
如果您尝试使用Bazel,我建议您接受runfiles的概念,并修改测试以使用runfiles结构,或者接受命令行参数,以便在哪里找到测试数据。
https://stackoverflow.com/questions/55307695
复制