2017-04-21 115 views
1

我很努力的讓一個任務只在定義特定值時執行。只在定義的屬性上執行Gradle運行任務

我正在使用Gradle 3.5。

task signJar(type: SignJar, dependsOn: reobfJar) { 
    onlyIf { 
     project.hasProperty('mod_keystore') 
    } 

    keyStore = project.keyStore 
    alias = project.keyStoreAlias 
    storePass = project.keyStorePass 
    keyPass = project.keyStoreKeyPass 
    inputFile = jar.archivePath 
    outputFile = jar.archivePath 
} 

正如你所看到的,我已經嘗試了唯一的If語句,但任務仍在運行。這導致到崩潰:

Could not get unknown property 'keyStore' for root project 'JustAnotherEnergy' of type org.gradle.api.Project. 

屬性「mod_keystore」是沒有定義的地方,但代碼獲取的執行。

task signJar(type: SignJar, dependsOn: reobfJar) { 
    if(project.hasProperty('mod_keystore')) { 
     keyStore = project.keyStore 
     alias = project.keyStoreAlias 
     storePass = project.keyStorePass 
     keyPass = project.keyStoreKeyPass 
     inputFile = jar.archivePath 
     outputFile = jar.archivePath 
    } 
} 

This works。代碼沒有得到執行,但我遇到了其他問題: 如果未定義屬性'mod_keystore',Gradle無法爲例如'keyStore'屬性設置值,但任務SignJar要求設置這個值。

這意味着只有在定義屬性'mod_keystore'時才應執行此任務。如果未定義,則應該跳過該任務。

回答

3

正如您所看到的,我已經嘗試了唯一的If語句,但任務仍在運行。

不,該任務不運行。您需要區分配置階段執行階段。在創建任務後立即在配置階段期間執行任務關閉,您正在設置任務屬性。在執行階段期間僅執行通過doFirstdoLast添加的任務操作(由任務類型定義)和關閉。

如果禁用或通過onlyIfenabled跳過一個任務,您只禁用/跳過執行(階段)的任務,而不是它的配置(階段)

至於你的具體問題的解決方案,你可以依靠你與onlyIf條件第一種方法,但增加了一個故障安全的方式來訪問你的項目屬性:

task signJar(type: SignJar, dependsOn: reobfJar) { 
    onlyIf { 
     hasProperty('mod_keystore') 
    } 

    keyStore = findProperty('keyStore') 
    alias = findProperty('keyStoreAlias') 
    storePass = findProperty('keyStorePass') 
    keyPass = findProperty('keyStoreKeyPass') 
    inputFile = jar.archivePath 
    outputFile = jar.archivePath 
}