Bazel-如何获得一个简短但密封的测试临时目录?

Bazel- how to get a short but hermetic temp dir for tests?

我有一个尝试启动嵌入式 mysql.
的测试 它尝试将套接字文件写入 Files.createTempFile(null, ".sock") which returns 并出现以下错误: mysql start failed with error: [ERROR] The socket file path is too long (> 103): /private/var/tmp/_bazel_user/1c8ed8d84f6cb79483aa3cc4da758c86/bazel-sandbox/2478112867584790357/execroot/some_workspace/_tmp/dfebe48cda4dfdc8739653efedfa4933/394798020705754292.sock.
我通过使用 jvm_flags 将 java 临时目录重新指向 /tmp 来解决这个问题,但是当我尝试使用沙盒时这不起作用,因为我 guess 不允许在那里写测试。

我试过从 java 代码设置一个符号 link(像这样 Files.createSymbolicLink(Paths.get("/tmp/foo"),Paths.get(System.getProperty("java.io.tmpdir"))) 但这似乎没有帮助。

我也试过设置 output_base 但这也无济于事。

非常感谢指点和提示,因为我目前无法 运行 在沙盒下进行测试,因此无法并行化它们。

我认为您将 Java 重新指向 /tmp 的方法应该可行。 macOS 沙箱总是允许写入多个目录和 /tmp 以及 /private/tmp are included in this set。我尝试使用 genrule 重现失败:genrule(name = "write_to_tmp", outs = ["out.txt"], cmd = "touch /tmp/something.sock && touch $@"),它工作正常并创建文件 /tmp/something.sock.

我认为通常使用 /tmp 应该可以正常工作,尽管它在 macOS 上似乎有点不寻常。 $TMPDIR 被 OS 设置为一个用户特定的文件夹,在 /var/folders 下面有一个随机名称,似乎通常鼓励使用它而不是 /tmp。但如果你知道自己在做什么,我看不出真正的问题。

请注意,我们在 macOS 上没有可用的 tmpfs 或类似机制,因此我们无法自动保证您通过操作对 /tmp 等可写文件夹的使用是密封的,不会't leak state between runs or that file names won't conflict.确保通过 mkstemp 或类似的方式以安全的方式生成文件名。

在 bazel 测试中,您可以将 TEST_TMPDIR 环境变量用于测试专用可写区域。

https://docs.bazel.build/versions/master/test-encyclopedia.html