Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
整合Go和Bazel测试_Go_Bazel - Fatal编程技术网

整合Go和Bazel测试

整合Go和Bazel测试,go,bazel,Go,Bazel,在我的CI系统中,我运行各种go脚本来分析我的go代码。例如,我有一个脚本,可以验证各种主文件是否可以成功启动长时间运行的应用程序。为此,我通过运行startupvalidator-pkgs=pkg1、pkg2、pk3运行go脚本。我对使用Bazel能够利用缓存进行此操作感兴趣,因为如果pkg1没有更改startupvalidator将能够命中pkg1的缓存,然后重新运行pkg2和pkg3 我想了几种不同的方法来做这件事,但没有一种感觉是正确的。有没有“最佳”的方法来实现这一点?这是bazel的

在我的CI系统中,我运行各种go脚本来分析我的go代码。例如,我有一个脚本,可以验证各种主文件是否可以成功启动长时间运行的应用程序。为此,我通过运行startupvalidator-pkgs=pkg1、pkg2、pk3运行go脚本。我对使用Bazel能够利用缓存进行此操作感兴趣,因为如果
pkg1
没有更改
startupvalidator
将能够命中
pkg1
的缓存,然后重新运行
pkg2
pkg3

我想了几种不同的方法来做这件事,但没有一种感觉是正确的。有没有“最佳”的方法来实现这一点?这是bazel的合理用例吗

我考虑创建一个bash脚本,在其中运行以下内容:

go run startupvalidator $1
使用包含以下内容的
BUILD.bazel
文件

sh_binary(
  name = "startupvalidator-sh",
  sources = [":startupvalidator.sh"],
  deps = [
    "//go/path/to/startupvalidator",
  ],
)
我还考虑在
BUILD.bazel
文件中为每个
pkg1
pkg2
pkg3
放置一个类似的sh_测试,这样我就可以运行
bazel run//go/pkg1:startupvalidator


然而,这实际上并不起作用。有没有人对我应该怎么做有反馈?欢迎提供任何方向或指针。

为了利用测试结果的缓存,您需要一个
*\u测试
,您可以使用
bazel测试运行该测试。可能您唯一缺少的部分是
bazel-run
只运行二进制文件(即使它是测试二进制文件),而
bazel-test
正在查找最新的测试结果,这意味着它使用缓存

您还需要拆分二进制文件,以便在
pkg2
中更改代码不会影响
pkg1
中的测试操作。缓存中的操作键包括其所有输入文件的内容、正在运行的命令等。我不确定您的
startupvalidator
是否编译了各种主要函数,或者它是否在运行时查找二进制文件。如果它编译它们,您将需要构建单独的。如果它在运行时加载文件,请将它在测试规则的
数据中查找的文件放入
,以便它们成为测试操作输入的一部分

我会在
pkg1
中执行类似的操作(假设它在运行时加载文件;如果它们是在中编译的,那么您可以创建单独的
go\u测试目标):

sh_测试(
名称='startupvalidator_测试',
srcs=['startupvalidator_test.sh'],
deps=['@bazel_tools//tools/bash/runfiles'],
数据=['//go/path/to/startupvalidator',':package_main'],
)
使用
startupvalidator\u test.sh
进行测试,其如下所示:

#---开始runfiles.bash初始化v2---
#复制粘贴自Bazel Bash runfiles库v2。
设置失败;f=bazel_tools/tools/bash/runfiles/runfiles.bash
源“${RUNFILES_DIR:-/dev/null}/$f”2>/dev/null ||\
来源“$(grep-sm1”^$f”“${RUNFILES_MANIFEST_FILE:-/dev/null}”| cut-f2--d”“)“2>/dev/null |”\
源“$0.runfiles/$f”2>/dev/null ||\
源“$(grep-sm1”^$f”“$0.runfiles_manifest”| cut-f2--d”“)“2>/dev/null |”\
源“$(grep-sm1”^$f”“$0.exe.runfiles_manifest”| cut-f2--d”“)“2>/dev/null |”\
{echo>&2“错误:找不到$f;退出1;};f=;set-e
exec$(rlocation workspace/go/path/to/startupvalidator)\
-main=$(rlocation workspace/pkg1/package_main)
#---end runfiles.bash初始化v2---
我假设
package\u main
是由
startupvalidator
加载的东西。Bazel被设置为将完整路径传递给依赖项,就像传递给其他二进制文件一样,因此我假装有一个新的标志,它采用完整路径而不仅仅是包名。shell脚本用于定位各种文件


如果您想在包之间消除重复数据,我将编写一个使用来生成shell脚本的脚本。

谢谢,Brian!我只是想说,你的回答真的很有帮助,为我指明了正确的方向