2012-10-12 33 views
2

我不知道groovy還不夠好,只是試圖通過現在得到。我有以下gradle這個現在工作的權利,但我不知道是否有寫它一個更簡潔的方式...有沒有辦法寫出更簡潔的gradle?

task staging(type: Sync) { 
    from(stagingDir) {} 
    into toStagingDir 
} 

task syncJars(type: Sync) { 
    from(configurations.compile) {} 
    from(fixedLibDir) {} 
    into toStagingLibsDir 
} 

task copyMainJar(type: Copy) { 
    from(libsDir) {} 
    into toStagingLibsDir 
} 

task myZip(type: Zip) { 
    archiveName "bacnet.zip" 
    from(buildDir) { 
     include project.name+'/**' 
    } 
} 

syncJars.dependsOn('staging') 
copyMainJar.dependsOn('syncJars') 
myZip.dependsOn('copyMainJar') 
assemble.dependsOn('myZip') 

或許有某種方式把它寫像這樣...

task prepareStaging { 
    staging from stagingDir into toStagingDir 
    syncJars from configurations.compile from fixedLibDir into toStagingLibsDir 
    copyMainJar from libsDir into toStagingLibsDir 
    myZip archiveName "bacnet.zip" from buildDir { include project.name+'/**' } 
} 

assemble.dependsOn('prepareStaging') 

理想情況下,我喜歡自我記錄代碼。在第二個例子中,對於下一個開發者來說,我的意思是每個這些小任務都不可重用。這非常明確(即自我記錄)。在第一種方式中,我編寫了絕對不清晰的代碼,因爲這些任務可以從其他項目文件中重用。

任何方式來寫在這個更簡單的形式?

注意:我仍然希望所有的UP-TO-DATE檢查都能像往常一樣順利進行!

感謝, 院長

回答

1

如果我理解正確,並toStagingDirtoStagingLibDir是屬於buildDir目錄下創建(在myZip任務)只是暫時的目錄,然後在下面應該做一個等價的工作,你的:

task myZip(type: Zip){ 
    archiveName "bacnet.zip" 
    into('staging'){ 
    from stagingDir 
    } 
    into('staging/libs'){ 
    from fixedLibDir 
    from configurations.compile 
    from libsDir 
    //or this, if you just want to include current projects jars 
    from jar.outputs.files 
    } 
} 

這裏的想法不是自己創建一個臨時目錄,而是讓gradle爲你做。

只要你不打電話cleanMyZip它會做最新的檢查,並做到最低限度。我上次檢查Zip的行爲與Sync非常相似,因爲它會從zip中刪除任何不在源中的文件。這可能與copyMainJar任務稍有不同,因爲它的類型爲Copy,這意味着如果您從libsDir中刪除了一個文件,那麼在我的情況下,它會從zip中消失,但在您的代碼中不會。

不知道這是不是甚至接近你問什麼,但希望這是至少有一點:)使用

制定的:在gradle這個

任務總是由公衆設計AFAIK。有一個enhancement request,但沒有太多的行動。你可以使用標準的groovy方法,它支持私人可見性,但它們不像任務那麼強大。雖然,你會發現,tasks can depend on groovy functions and more(或任何與call()方法),這樣你就可以做的東西,如:

def function = { 
    println "function here!" 
} 

task myTask(dependsOn: function) << { 
    println "myTask here!" 
} 

將產生:

function here! 
:a:myTask 
myTask here! 

這應該給你一些靈活性,但如果你真的真的真的需要你可以做一些骯髒的黑客(我知道搖籃傢伙會恨我這個XX)的私人任務......這就是:

//Create a factory for creating tasks 
import org.gradle.api.internal.project.taskfactory.ITaskFactory 
def taskFactory = project.services.get(ITaskFactory) 

//You can use the factory to create tasks without adding them to 
//project.tasks, which will make them invisible to most irrelevant 
//parts of your code, and they will not come up in `gradle tasks` list: 

//Equivalent of: 
// task myTask << { 
// println "i'm invisible" 
// } 
def privateTask = taskFactory.createTask([name: 'myTask']).doLast { 
    println "i'm invisible" 
} 

//Equivalent of: 
// task myCopyTask(type: Copy){ 
// from configurations.compile 
// into 'libs' 
// } 
def privateCopyTask = taskFactory.createTask([name: 'myCopyTask', type: Copy]) 
          .configure { 
    from configurations.compile 
    into 'lib-test' 
} 

//You can depend on the above tasks as usual from your public tasks: 
task publicTask(dependsOn: [privateTask, privateCopyTask]) << { 
    println "I'm public task" 
} 

注:似乎在Gradle 1.2中工作,但使用風險自負!

祝你好運!

+0

肯定有一些用處(我會很好地使用它),但是我真正想知道的是,如果有一種方法可以在任務中編寫任務,以便與下一個開發人員溝通,那麼這個任務實際上是一個工作單元應該捆綁在一起。 –

+0

我明白了。請參閱原文,瞭解一些細節。 – rodion

相關問題