为了账号安全,请及时绑定邮箱和手机立即绑定

GO Monorepo:需要使用 go build 重建的文件列表

GO Monorepo:需要使用 go build 重建的文件列表

Go
饮歌长啸 2022-12-26 10:40:30
我的 go 项目有一个 monorepo 设置。如果我能找到一种方法来使用 go build(或类似的内部工具)来获取需要重新构建的目标列表,我会很高兴。这是我正在寻找的示例:...├── pkg //shared code across mono repo│   └── math│       └── common_operations.go└── cmd // individual packages to be built     ├── package1    │   └── main.go    └── package2        └── main.gopackage1 程序调用数学共享库中的减法函数。package2 程序调用一个 add 函数。如果我更改 package1 代码,则仅列出 package1 目标如果我更改 package2 代码,则仅列出 package2 目标如果我更改共享库中的添加函数,则只会列出 package2 目标如果我更改共享库中的减法函数,则只会列出 package1 目标如果我更改共享库中的所有函数,package1 和 package2 都会重建。我非常乐意使用内部构建包并以编程方式获取列表。我只是不熟悉它。我尝试过的方法: Bazel 对此有一个选项,但我宁愿尽可能避免使用 bazel。bazel 命令:bazel build cmd/some-target --check_up_to_date如果它是最新的,则返回错误代码 0,否则返回错误代码 1。这在技术上是一个解决方案,但正如您可能已经推断的那样,我的需要是基于 ci/cd 的。我想尽可能避免将 Bazel 集成到该过程中。
查看完整描述

2 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

不太确定这里的用例,你也可以实际编译包吗?在那种情况下,也许go build -v可以为您完成这项工作。来自go help build:

-v 
       print the names of packages as they are compiled.


查看完整回答
反对 回复 2022-12-26
?
开满天机

TA贡献1786条经验 获得超13个赞

我的愿望是找到类似于 go build 选项的东西,如果目标包是最新的,它基本上会吐出 true 或 false。如果有人找到可以解决这个问题的工具(地球上我现在正在看着你),我会很高兴。

我能找到解决问题的最接近解决方案的方法是运行此命令:

go build -n cmd/some-target

如果输出是:

touch some-target

然后,它必须是最新的。如果输出是一长串命令,则不是。如果不是最新的。然后您可以使用以下方法获取包名称:

go build -v

获取包的名称并将其移动到 CI 过程的下一阶段(构建目标、测试目标、构建映像等)。

显然,它有点老套,需要自行推出解决方案,具体细节可能需要根据您的具体需求进行更改。正如 @zacho314 提到的,它还需要保存 go build 缓存的状态,但大多数现代 CI 技术都有解决方案。我确定我现在会做类似的事情。


查看完整回答
反对 回复 2022-12-26
  • 2 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信