7

(以下是怎樣的一個「理論MCVE」種複雜的,我遇到了組織的源代碼我的工作,你可以把它當作。一個具體的問題,這將是很好的,或者你可以參考它帶來的一般問題,並建議如何解決它們。)管理複雜的存儲庫結構 - 模塊依賴和共享代碼

假設我有模塊代碼A,B,C和D. A取決於B ,光盤; B取決於C; C,D不依賴於其他模塊。 (我使用「模塊」這個術語,因此請不要在這裏挑剔)。

此外,在所有的A,B,C,D中,使用了幾個相同的頭文件,甚至可能是一個編譯對象,將它們放在一起形成第五個模塊是沒有意義的,因爲它會太小而無用。讓我們將foo.h作爲該類別中的文件之一。

雖然所有這些模塊被保持單個單片代碼庫中,都是很好。一切都完全相同。對象之間沒有連接衝突具有相同功能等

enter image description here

問題是編譯:怎樣使每個B的,C,d爲版本管理信息庫,使:

  • 他們每個人可以只用這取決於(或者作爲子模塊/ subrepositories或一些其他方式)的模塊的存在來構建;和
  • 我並不需要確保和手動保持相同的文件/更新不同版本,或使結轉承諾從一個庫到下一個(也許除了改變所指向的版本);和
  • 當一切都建立起來(即A樓時),構建不涉及和C的雙副本foo.h qudaruple副本(一次A和一次B) - 這是我大概總是要確保並保持完美同步。

請注意,當我有更多時間時,我會編輯這個問題以使問題更加具體(即使我有點像廣泛的問題)。我會說在我的具體情況下,代碼是現代C++,CUDA,一些bash腳本和CMake模塊。所以一個面向Java的解決方案不會。

+0

整個系統需要幾個小時才能編譯?如果時間少於2或3小時,我認爲你不應該試圖將它分解成subrepos。 –

+0

@IanRingrose:編譯需要幾分鐘而不是幾個小時。但是,其中一些已經/將會獨立出版(不止一個此類部分);還有不同的人在不同的部分分工的問題,或者根據不同的「帽子」來分擔工作的問題。 – einpoklum

+1

Git有子模塊,它允許您從另一個存儲庫中引用一個存儲庫的特定提交。 (你可以看到子模塊的來源,但不能在沒有跳過的情況下改變它。)這可能是值得一看的,並且關於git子模塊有很多關於SO的問題。 –

回答

1

很簡單,你可能想探索一個神器庫(Artifactory的)和依賴管理解決方案(常春藤,Maven的,搖籃)。然後,隨着共享基礎模塊的建立,您可以將其粘貼在工件回購中。當你想構建依賴於共享基礎模塊的頂級模塊時;構建腳本只需將最後一個版本的shared-base-module拉下來,然後將頂層模塊鏈接到頂層模塊。

+1

(1)你可以添加一個或兩個鏈接到你會推薦的地方我會閱讀這些東西? (2)「工藝品」和「依賴管理解決方案」是互補還是矛盾的?還是正交? (3)常春藤,Maven和Gradle不是非常面向Java的? – einpoklum

+0

@einpoklum是的,他們是爲Java。雖然可以使用它們,但我不這麼認爲。 – Walfrat