我的 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.

開滿天機
TA貢獻1786條經驗 獲得超13個贊
我的愿望是找到類似于 go build 選項的東西,如果目標包是最新的,它基本上會吐出 true 或 false。如果有人找到可以解決這個問題的工具(地球上我現在正在看著你),我會很高興。
我能找到解決問題的最接近解決方案的方法是運行此命令:
go build -n cmd/some-target
如果輸出是:
touch some-target
然后,它必須是最新的。如果輸出是一長串命令,則不是。如果不是最新的。然后您可以使用以下方法獲取包名稱:
go build -v
獲取包的名稱并將其移動到 CI 過程的下一階段(構建目標、測試目標、構建映像等)。
顯然,它有點老套,需要自行推出解決方案,具體細節可能需要根據您的具體需求進行更改。正如 @zacho314 提到的,它還需要保存 go build 緩存的狀態,但大多數現代 CI 技術都有解決方案。我確定我現在會做類似的事情。
- 2 回答
- 0 關注
- 165 瀏覽
添加回答
舉報
0/150
提交
取消