2017-06-13 44 views
0

我們用我們的cusrom插件,並以這種方式定義的腳本(這是一個近似的僞代碼):搖籃 - 在不同的DSL的共同部分(其他)git倉庫

//It is common part for every script (1) 
environments { 
    "env1" { 
    server mySettings("host1", "port1", "etc") 
    } 
    "env2" { 
    server mySettings("host2", "port2", "etc") 
    } 
    ... //another common scopes 
} 

def defaultSettings(def envHost, def envPort = "15555" ...) { 
    return { 
    // Specific settings for the current script (package names, versions etc) 
    } 
} 

因此,在我所有的腳本中(這些腳本是單獨的項目,並且位於單獨的git存儲庫中),重複公用部分(1)。

是否有任何正確的方法來將公共部分定義爲特定項目(這不能是插件的一部分 - 公共部分也會週期性變化)?

我想在創建新項目時參考這一部分,並只描述項目特定的設置。

它看起來像gradle multi-project構建,但通用部分應該在其他git repository/Nexus中。

重要說明 - 通用部分也可以在Nexus中,有一個版本(有POM描述符)。

回答

1

擁有「自以爲是」的插件和「基礎」插件是很常見的。 Gradle經常使用這個概念。

一個例子是java插件自動應用java-base插件。所以java-base插件包含所有的任務(邏輯),但實際上並沒有做任何事情。 java插件添加任務並配置它們(例如,它添加了src/main/javasrc/test/java約定)。所以java-base插件沒有自以爲是,java插件是自以爲是。

所以,你可以做同樣的,有一個base插件和opinionated插件,它

  1. 應用base插件
  2. 配置特定的環境,爲您的使用情況

還要注意如果將邏輯置於project.with { ... }閉包內,則可以將邏輯從build.gradle移至插件。例如:

class MyPlugin implements Plugin<Project> { 
    void apply(Project project) { 
     project.with { 
      subprojects { ... } 
      configurations { ... } 
      dependencies { ... } 
      task foo(type: Bar) { ... } 
     } 
    } 
} 
+0

感謝您的回覆。但也許我有一個稍微不同的問題 - 基本的通用功能是一個腳本也會改變(並且可以經常)。我想將所有這些更改應用到我的所有腳本中。例如,作爲Java項目中的JAR依賴項。 –

+0

將腳本封裝到插件jar中,並讓插件在執行之前提取腳本(通過'apply from:')。您可以使用動態版本(或「-SNAPSHOT」版本),以便插件的更新將自動流向項目 –

+0

Tnanks,我明白您的意思,我會在幾天內嘗試此解決方案 –

0

還有另一種解決方案來解決您的問題。這種方法可能比使用自以爲是的插件更不乾淨,但它允許您獨立於項目管理簡單的Gradle腳本:

apply from:包含Gradle腳本的術語不限於文件路徑,也可以處理URL。這樣,您可以簡單地在獨立存儲庫中管理腳本,並通過Web服務器提供最新版本。

爲了測試腳本分發和訪問這種方式,你甚至可以使用像GitHub的或到位桶各種庫平臺提供的原始文件視圖功能:

apply from: 'https://raw.githubusercontent.com/<user>/<repo>/<branch>/<file>' 

這種方法的最大缺點是,如果您需要確保公司外部或離線構建,您需要訪問本地甚至全球Web服務器,您應該堅持使用@LanceJavas解決方案並使用自定義插件。