gradle项目 构建_使用Gradle构建Monorepo项目
gradle項目 構(gòu)建
根據(jù)Wikipedia的說法 , monorepo是一種軟件開發(fā)策略,其中許多項目存儲在同一資源庫中。 這種策略可以快速檢測到因依賴關(guān)系的更改而導(dǎo)致的潛在問題和破壞,并且已被許多使用大型代碼庫的組織采用,例如Google,Facebook和Twitter。
如果碰巧將Gradle用作您的首選構(gòu)建工具,那么您也可以應(yīng)用此策略,這要歸功于3.1版中引入的Composite Builds功能(在撰寫本文時,最新版本為5.0)。 讓我們看看不使用此功能時的典型Monorepo工作流程。
沒有復(fù)合建筑的生活
假設(shè)您剛剛在一家公司中工作,該公司的項目保存在單個存儲庫中。 每個項目都有一個單獨的構(gòu)建,并且它們之間的唯一關(guān)系是通過相互依賴來滿足他們的需求。 有些項目比其他項目具有更多的依賴關(guān)系,有些項目甚至可能與其他項目沒有依賴關(guān)系。
項目數(shù)量很重要; 當(dāng)價格較低時,您可以說所有這些工具都可以放在一個傘項目下,就像使用Maven及其React堆功能所做的那樣。 Gradle具有類似的功能,除了在不觸發(fā)所有其他項目的情況下更輕松地定位特定的構(gòu)建之外。 在某種程度上,您可以說Gradle的React堆更智能,可以選擇要執(zhí)行的目標(biāo)。
但是,當(dāng)項目數(shù)量超過一打,比如說幾百個時,會發(fā)生什么? 即使使用更智能的React堆,Gradle也必須閱讀所有項目的配置,然后解決適當(dāng)?shù)哪繕?biāo)。 當(dāng)然,這將花費您寶貴的日常工作,這是一個很大的禁忌。
解決方案是將每個項目分解為單獨的版本。 React堆功能已經(jīng)一去不復(fù)返了,因此我們不必付出閱讀和配置所有項目的代價,以后再丟棄其中的大多數(shù)項目。 但是,現(xiàn)在當(dāng)依賴項可能引入了錯誤或二進(jìn)制不兼容時,我們失去了做出響應(yīng)的機(jī)會,這是在monorepo中組織代碼的原因之一。
現(xiàn)在,我們必須遵循以前嘗試過的
- 在依賴項項目上進(jìn)行更改。
- 構(gòu)建工件并將其發(fā)布到存儲庫。 大多數(shù)人都依賴快照工件。
- 確保從屬項目使用了最新發(fā)布的工件/快照。
- 編譯并運(yùn)行測試以確定代碼是否可以再次運(yùn)行。
- 沖洗并重復(fù)直到起作用。
這種方法的問題在于,我們浪費時間來發(fā)布中間工件,并且不時地形成表單,我們會忘記發(fā)布快照發(fā)行版,而在調(diào)試會話中花費數(shù)小時,直到我們意識到二進(jìn)制文件是不正確的,嗯。
復(fù)合材料為營救
現(xiàn)在讓我們看看Composite Builds如何解決我們所遇到的問題。我們首先查看以下項目及其之間的依賴關(guān)系
項目1
Project2 <–取決于— Project1
Project3 <–取決于— Project2
這個小的依賴關(guān)系圖告訴我們,對Project1所做的任何更改都會影響Project2,從而也影響到Project3,因為對Project2所做的更改也會影響Project3。 此monorepo的目錄結(jié)構(gòu)如下所示
. ├── project1 │ └── build.gradle ├── project2 │ └── build.gradle └── project3└── build.gradle在這里,我們可以看到三個項目及其各自的構(gòu)建文件。 每個項目都有其自己的發(fā)布生命周期和版本,我們可以在其構(gòu)建文件中觀察到
project1 / build.gradle
apply plugin: 'java'group = 'com.acme' version = '1.0.0'project2 / build.gradle
apply plugin: 'java'group = 'com.acme' version = '2.3.0'dependencies {compile 'com.acme:project1:1.0.0' }project3 / build.gradle
apply plugin: 'java'group = 'com.acme' version = '1.2.0'dependencies {compile 'com.acme:project2:2.3.0' }要激活“復(fù)合構(gòu)建”功能,需要在名為settings.gradle的文件中配置項目之間的鏈接。 項目2和3需要此文件,因此我們的存儲庫如下所示
. ├── project1 │ └── build.gradle ├── project2 │ ├── build.gradle │ └── settings.gradle └── project3├── build.gradle└── settings.gradle接下來,我們像這樣寫下項目之間的鏈接
project2 / settings.gradle
includeBuild '../project1'project3 / settings.gradle
includeBuild '../project2'大。 完成此設(shè)置后,我們現(xiàn)在可以通過發(fā)出以下命令來構(gòu)建project3
$ cd project3 $ pwd /tmp/project3 $ gradle classes > Task :processResources > Task :project2:processResources > Task :project1:compileJava > Task :project1:processResources > Task :project1:classes > Task :project1:jar > Task :project2:compileJava > Task :project2:classes > Task :project2:jar > Task :compileJava > Task :classes如您所見,project1和project2均已構(gòu)建。 對project1進(jìn)行更改并再次觸發(fā)對project3的構(gòu)建,將按預(yù)期構(gòu)建所有三個項目。 現(xiàn)在,假設(shè)將此Monorepo擴(kuò)展到數(shù)十個或數(shù)百個項目,您會很快意識到幾乎不需要快照版本(如果有)。 Gradle還具有其他功能,例如輸入/輸出的任務(wù)緩存,這也使構(gòu)建更快。 類似地,最近宣布的構(gòu)建緩存功能通過“捕獲” CI服務(wù)器場中其他節(jié)點已計算的輸出來加快構(gòu)建速度。
如果您喜歡本文,則可以在我的博客上找到有關(guān)Gradle和構(gòu)建工具的其他有趣文章。
翻譯自: https://www.javacodegeeks.com/2018/12/building-monorepo-projects-gradle.html
gradle項目 構(gòu)建
總結(jié)
以上是生活随笔為你收集整理的gradle项目 构建_使用Gradle构建Monorepo项目的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 键盘乘号快捷键(电脑键盘乘号快捷键)
- 下一篇: 蒸汽平台上线后steam的游戏还有没有详