2014-11-21 87 views
0

我有兩個任務nativeJar和native64Jar,清單和doLast閉包對於除文件名外的任務都相同。因此,可以使用通用方法提取該代碼,並將兩個文件名作爲方法參數傳遞,並從兩個任務中調用該通用方法,或從dolast clouser調用該方法。如何從gradle jar任務提取公共代碼到方法

task nativeJar(type: Jar) { 

     doFirst { 

      delete fileTree(dir: "$releaseDir", include: "*.jar") 

     } 
     baseName = 'NativeLibs' 
     destinationDir = new File(releaseDir) 
     from files(releaseDir + 'jar_merge/signedNativeLibs') 
     manifest { 
      attributes 'Permissions' : 'all-permissions', 'Publisher' : 'abc', 'Application-Name' : 'WorkBench', 'Codebase' : '*.abc.com' 
     } 

     doLast { 
      ant.signjar(jar: "$releaseDir/NativeLibs.jar", alias:"WorkBench", keystore: "WorkBench.jks", signedjar: "$releaseDir/signedNativeLibs.jar", storepass: "freddie") 
     } 

    } 


    // Create signedNativeLibs64.jar file 

    task native64Jar(type: Jar , dependsOn: 'nativeJar') { 
     baseName = 'NativeLibs64' 
     destinationDir = new File(releaseDir) 
     from files(releaseDir + 'jar_merge/signedNativeLibs64') 
     manifest { 
      attributes 'Permissions' : 'all-permissions', 'Publisher' : 'abc', 'Application-Name' : 'WorkBench', 'Codebase' : '*.abc.com' 
     } 

     doLast { 
      ant.signjar(jar: "$releaseDir/NativeLibs64.jar", alias:"WorkBench", keystore: "WorkBench.jks", signedjar: "$releaseDir/signedNativeLibs64.jar", storepass: "freddie") 
     } 

    } 

回答

0

我會建議分裂出來的簽署作爲一個單獨的任務,讓你從搖籃得到適當跟上時代的檢查。正如你現在所做的那樣,每當你製作時你都會在罐子上簽名。如果您刪除簽名的jar文件,它將不會再生成,直到您清理本地jar文件。

您可以共享任務之間的配置關閉。例如,

[ task1, task2 ].each { task -> 
    task.configure { 
     // shared closure 
    } 
} 

我會遵循一些其他的最佳實踐。

  • 不要使用新的File(),因爲它使您的腳本依賴於當前的工作目錄。
  • 通過任務引用輸出與重新創建完整路徑(例如,您使用$ releaseDir/NativeLibs.jar進行的操作)。 Gradle能夠以這種方式推斷依賴關係。
  • 使用自定義任務類與doFirst()/ doLast()的特殊任務。既然你把所有的工作委託給了ant任務,這應該是非常簡單的。

我不知道爲什麼你需要你的特定文件名,但我保持原樣。如果它們不重要,刪除它們會使這更簡單。

我參加了一個刺在你的榜樣(聲明:我沒有嘗試):

task nativeJar(type: Jar) { 
    baseName = 'NativeLibs' 
    from files(releaseDir + 'jar_merge/signedNativeLibs') 
} 

task native64Jar(type: Jar) { 
    baseName = 'NativeLibs64' 
    from files(releaseDir + 'jar_merge/signedNativeLibs64') 
} 

[ nativeJar, native64Jar ].each { task -> 
    task.configure { 
     destinationDir = file(releaseDir) 
     manifest { 
      attributes 'Permissions' : 'all-permissions', 'Publisher' : 'Financial Engineering', 'Application-Name' : 'WorkBench', 'Codebase' : '*.fhlmc.com' 
     } 
    } 
} 

//這個類的定義應該在其他您的build.gradle腳本它將頂部通過評論

class SignJarTask extends DefaultTask { 
    @InputFile File inputFile 
    @OutputFile File outputFile 

    @TaskAction 
    void signJar() { 
     ant.signjar(jar: inputFile, alias:"WorkBench", keystore: "WorkBench.jks", signedjar: outputFile, storepass: "freddie") 
    } 
} 

task signJar(type: SignJarTask) { 
    inputFile = file("$releaseDir/NativeLibs.jar") 
    outputFile = file("$releaseDir/signedNativeLibs.jar") 
} 

task sign64Jar(type: SignJarTask) { 
    inputFile = file("$releaseDir/NativeLibs64.jar") 
    outputFile = file("$releaseDir/signedNativeLibs64.jar") 
} 
+0

有關此異常的任何想法,提到一個例外雖然行296是類SignJarTask擴展DefaultTask { *出了什麼問題: 無法編譯構建網絡le'C:\ workspace \ workbench \ build.gradle'。 >啓動失敗: 構建文件'C:\ workspace \ workbench \ build.gradle':296:此處不需要類定義。請在適當的地方定義課程 或者嘗試使用block/Closure。在行:296柱:5.文件:build_3ps3f1f00ilt6reek6t9f0j4go @線296,第5列 類SignJarTask延伸DefaultTask { ^ 1錯誤 – 2014-11-21 18:57:43

+0

可能丟失的{},(),或。由於我沒有一個完整的例子,我只是輸入了大部分盲人。 – bigguy 2014-11-21 20:06:15

+0

我不這麼認爲,因爲我刪除了您的自定義任務,並使用了gradle示例中的以下任務,並且得到了相同的異常,因此我將任務置於gradle腳本的頂部,並且在使用相同的小改動邏輯任務招呼(類型:GreetingTask) 類GreetingTask擴展DefaultTask { @TaskAction 高清迎接(){ 的println '你好從GreetingTask' }} 大 – 2014-11-21 20:10:10