2010-02-15 146 views
76

我有一個複雜的gradle腳本,它在構建和部署一些netbeans項目到許多環境中時包裝了大量的功能。如何將一個Gradle腳本導入另一個?

該腳本工作得很好,但本質上它都是通過持有項目和環境信息的半打地圖配置的。

我想將任務抽象到另一個文件中,以便我可以簡單地在簡單的構建文件中定義我的地圖,並從其他文件導入任務。通過這種方式,我可以爲許多項目使用相同的核心任務,並使用一組簡單的地圖來配置這些項目。

任何人都可以告訴我如何以類似Ant的任務的方式將一個gradle文件導入到另一個文件中?到目前爲止,我已經對Gradle的文檔進行了翻查。

附加信息

低於湯姆的響應後,我想我會嘗試和澄清正是我的意思。

基本上我有一個運行一些子項目的gradle腳本。然而,子項目都是Netbeans項目,並且都有自己的ant build腳本,所以我有gradle中的任務來調用這些腳本。

我的問題是,我有一些配置在文件的頂部,如:

projects = [ 
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"], 
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"] 
] 

我然後生成的任務,如:

projects.each({ 
    task "checkout_$it.shortname" << { 
     // Code to for example check module out from cvs using config from 'it'. 
    } 
}) 

我有許多種類的任務生成片段,並且它們都是通用的 - 它們完全依賴於項目列表中的配置。

所以,我要的是把這種在一個單獨的腳本,並在下面這種方式導入的方式:

projects = [ 
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"], 
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"] 
] 

import("tasks.gradle") // This will import and run the script so that all tasks are generated for the projects given above. 

因此,在這個例子中,tasks.gradle將所有的通用任務生成代碼,並將運行在主build.gradle文件中定義的項目。通過這種方式,tasks.gradle是一個可由所有大型項目使用的文件,這些項目由許多具有Netbeans ant構建文件的子項目組成。

+3

考慮 「從適用: 'other.gradle'」 構建導入外部聲明。 (請參閱「12.4。使用外部構建腳本配置項目」此處http://gradle.org/0.9-preview-1/docs/userguide/tutorial_this_and_that.html#sec:configuring_using_external_script) –

+0

@PetrGladkikh'apply from'立即執行外部任務。這在執行邏輯中可能不是最好的(也就是說,我希望在不想馬上執行任務時)。 –

+0

上面的註釋中的這個語句是**不正確**:'apply from'立即執行外部任務。不要誤導。外部任務已配置,未執行。 – Jarekczek

回答

12

的問題的答案竟然是在插件系統,在那裏你可以在一組插件可以是位於常規文件添加所需的功能目錄buildSrc/src/main/groovy。插件也可以捆綁成一個罐子,儘管我還沒有嘗試過。

詳情點擊這裏:Custom Plugins

+0

只是爲了讓您知道鏈接已損壞 - 以下是更新http://gradle.org/docs/current/userguide/userguide_single.html#sec:configuring_using_external_script – JamesC

+0

插件鏈接:http://gradle.org/docs/current/ userguide/userguide_single.html#custom_plugins – JamesC

4

那麼,很難說實際看到你的構建文件是什麼爲你提供最好的服務。

我可以假設,由於多項目構建應該爲您提供您正在尋找的抽象概念,因此可以設置您的環境。

在你的項目根build.gradle定義你的所有域特定的東西,以及適用於所有您的子項目的事情:

repositories { 
    add(new org.apache.ivy.plugins.resolver.FileSystemResolver()) { 
     name = 'destRepo' 
     addIvyPattern(file(project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/ivys/ivy(-[revision]).xml') 
     addArtifactPattern(file(project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/[type]s/[artifact](-[revision]).[ext]') 
     descriptor = 'optional' 
     checkmodified = true 
    } 
    ... 
} 
... 
subprojects { 
    sourceCompatibility = 1.5 
    targetCompatibility = 1.5 
    group = 'my.group' 
    version = '1.0' 
    uploadArchives { 
     uploadDescriptor = true 
     repositories { 
      add rootProject.repositories.destRepo 
     } 
    } 
    apply{ type my.group.gradle.api.plugins.MyPlugin } 
    ... 
} 

dependsOnChildren() 

項目的根目錄也可能包含gradle.properties文件,其中定義通過您的項目使用的屬性:

buildDirName=staging 
repo.dest.dir=/var/repo 
... 

然後從命名您的項目根附加文件settings.gradle你實際上指向您的子項目:

include 'my-first-component', 
     'my-second-component' 
... 
project(':my-first-component').projectDir = new File(rootDir, 'path/to/first/component') 
project(':my-second-component').projectDir = new File(rootDir, 'path/to/second/component') 
... 

每一個子項目目錄包含了build.gradle文件只包含子項目具體的東西。

無論您是從項目根目錄還是子項目目錄中調用gradle,gradle都會自動考慮您在各種文件中完成的所有定義。

另請注意,只要您不在根級別的默認插件之外加載任何插件,就不會爲您的項目根執行編譯任務。

+1

感謝您花時間回答。這不是我遇到麻煩的子項目,而是創建一個常見任務的「庫」。我使用更多信息和代碼片段編輯了我的原始問題,以使事情更清晰。 –

+1

因此,您不必從樣本中導入(「tasks.gradle」),而是使用子項目部分指定所有子項目使用的通用任務生成代碼。這應該提供您正在尋找的相同抽象!? – Tom

+0

常春藤插件真的有必要嗎?無法單獨使用Gradle嗎? –

相關問題