2014-11-21 51 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