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
我有一个尝试启动嵌入式 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