我有一个单线程设置为我的go项目。如果我能找到一种方法来使用go build(或类似的内部工具)来获得需要重新构建的目标列表,我会很高兴的。
这是我正在寻找的一个例子:
...
├── pkg //shared code across mono repo
│ └── math
│ └── common_operations.go
└── cmd // individual packages to be built
├── package1
│ └── main.go
└── package2
└── main.go
package1程序从math共享库调用一个减法函数。package2程序调用一个add函数。
- 如果我改变package1代码,只有package1目标被列出
- 如果我改变package2代码,只有package2目标被列出
- 如果我改变了共享库中的add函数,只有package2目标被列出
- 如果我改变了共享库中的减法函数,只有package1目标被列出
- 如果我改变了共享库中的所有函数,package1和package2都会重新构建。
我将非常乐意使用使用内部构建包并以编程方式获得列表。我只是对它不熟悉。
我试过了:Bazel有一个选项,但我宁愿避免使用Bazel,如果可能的话。如果bazel build cmd/some-target --check_up_to_date
是最新的,则返回错误码0,否则返回错误码1。这在技术上是一个解决方案,但我的需求,正如您可能已经推断的,是基于ci/cd的。我想尽量避免让Bazel参与到这个过程中来。
不太确定这里的用例,您是否可以实际编译包?在这种情况下,也许go build -v
可以为你做这项工作。来自go help build
:
-v
print the names of packages as they are compiled.
我的愿望是找到类似于go构建选项的东西,如果目标包是最新的,它基本上会吐出true或false。如果有人在那里找到一个工具(地球我现在看着你),可以解决这个问题,我会很高兴。
我能找到的解决这个问题的最接近的方法是运行这个命令:
go build -n cmd/some-target
如果输出为:
touch some-target
那么,它必须是最新的。如果输出是一长串命令,那么它就不是。如果它不是最新的。然后可以使用以下命令获取包名:
go build -v
获取包的名称,并将其移动到CI过程的下一个阶段(构建目标、测试目标、构建映像等)。
显然,这有点粗糙,需要自行滚动解决方案,具体细节可能需要根据您的确切需求进行更改。正如@zacho314所提到的,它还需要保存go构建缓存的状态,但大多数现代CI技术都有解决方案。我相信我现在会做类似的事情。