如何从gradle jar任务提取公共代码到方法
问题描述:
我有两个任务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")
}
}
答
我会建议分裂出来的签署作为一个单独的任务,让你从摇篮得到适当跟上时代的检查。正如你现在所做的那样,每当你制作时你都会在罐子上签名。如果您删除签名的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")
}
有关此异常的任何想法,提到一个例外虽然行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
可能丢失的{},(),或。由于我没有一个完整的例子,我只是输入了大部分盲人。 – bigguy 2014-11-21 20:06:15
我不这么认为,因为我删除了您的自定义任务,并使用了gradle示例中的以下任务,并且得到了相同的异常,因此我将任务置于gradle脚本的顶部,并且在使用相同的小改动逻辑任务招呼(类型:GreetingTask) 类GreetingTask扩展DefaultTask { @TaskAction 高清迎接(){ 的println '你好从GreetingTask' }} 大 – 2014-11-21 20:10:10