2013-10-30 76 views
5

在Gradle中进行排序时感到困惑。我是一个新手,以前使用Ant来构建,和Gradle一起玩,这可能会解释一些这方面的知识。简要背景(如果有人会问“你为什么要这么做”)。 我们在战争文件中发布了一个Java WebStart应用程序。 Java 7(-40以上)正在提示用户有关缺少元素的错误格式的jar文件。我想自动化一个能够引发战争的过程;从'bin'文件夹中提取JavaWS的罐子;将元素添加到清单中 稍后,我将开始重新签署瓶子并重新组装战争,但现在我只想添加Manifest条目。Gradle,dependsOn命令

我的问题是,我已经定义了具有dependsOn元素的任务,但任务似乎以错误的顺序运行(请参阅下面的gradle文件)。 我期望的是按顺序运行的任务:delete dir;打仗;不战争;将元素添加到jar中。 我从日志文件中看到的是:元素被添加到jar中,实际上这会创建一个新的jar文件,目录被删除并且战争未被打乱,所以我最终得到原始的war文件内容。但是,我似乎无法使用mustRunAfter,可能与我拥有的gradle版本有关,但无论如何我并不想控制不同任务的顺序,我宁愿(在我的基于Ant的思想中)我可以通过让任务彼此依赖来定义我想要的顺序。

任何人都可以看到我的构建文件中的缺陷? 注意:如果我从resignclientjars任务中删除“dependsOn”,并在运行其他任务后手动运行它,它一切正常,我得到我的罐子与Manifest中的新元素,所以我有一个可行的解决方法,但会宁愿知道我在这里做错了什么。

task (deletework, type: Delete) { 
    delete 'workYYY' 
} 

task (getlaganwar, type: Copy, dependsOn: deletework) { 
    from "d:/dev/v8-0-5/wars" 
    into "workYYY" 
    include 'lagan.war' 
} 

task (unwar, type: Copy, dependsOn: getlaganwar) { 
    from zipTree(file('workYYY/lagan.war')) 
    into file("workYYY/lagan") 
} 

task (resignclientjars, type: Copy, dependsOn: unwar) { 
//task (resignclientjars, type: Copy) { 

// mustRunAfter unwar 

    def workDir = file("workYYY/lagan") 
    def binDir = file(new File(workDir, "bin")) 

    def collection = files { binDir.listFiles() } 
    collection.each { 
     File jarFile = new File(binDir, it.name) 
     ant.echo(message: "updating:${jarFile.absolutePath}") 
     ant.jar(jarfile: jarFile, update: 'true') { 
      manifest { 
       attribute(name: 'Implementation-Title', value: 'Lagan Enterprise') 
       attribute(name: 'Implementation-Vendor', value: 'Lagan Enterprise') 
       attribute(name: 'Implementation-Version', value: 'Lagan Enterprise') 
       attribute(name: 'Application-Name', value: 'Lagan Enterprise') 
       attribute(name: 'Permissions', value: 'all-permissions') 
      } 
     } 
    } 
} 

//unwar.mustRunAfter getlaganwar 
//getlaganwar.mustRunAfter deletework 
//resignclientjars.mustRunAfter getlaganwar 

调试输出包含以下内容:从1.6

[sts] ----------------------------------------------------- 
[sts] Starting Gradle build for the following tasks: 
[sts]  :resignclientjars 
[sts] ----------------------------------------------------- 

12:06:19.658 [WARN] [org.gradle.api.internal.project.ant.AntLoggingAdapter] [ant:echo] updating:D:\dev\util\java7-clientjars\workYYY\lagan\bin\DebugWinIEBrowser.jar 
12:06:19.666 [WARN] [org.gradle.api.internal.project.ant.AntLoggingAdapter] [ant:echo] updating:D:\dev\util\java7-clientjars\workYYY\lagan\bin\DebugWinMSWord.jar 
12:06:19.670 [WARN] [org.gradle.api.internal.project.ant.AntLoggingAdapter] [ant:echo] updating:D:\dev\util\java7-clientjars\workYYY\lagan\bin\WinIEBrowser.jar 
12:06:19.674 [WARN] [org.gradle.api.internal.project.ant.AntLoggingAdapter] [ant:echo] updating:D:\dev\util\java7-clientjars\workYYY\lagan\bin\WinMSWord.jar 

12:06:19.690 [INFO] [org.gradle.execution.TaskNameResolvingBuildConfigurationAction] Selected primary task ':resignclientjars' 
12:06:19.692 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire exclusive lock on task artifact state cache (D:\dev\util\java7-clientjars\.gradle\1.5\taskArtifacts). 
12:06:19.692 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired. 
12:06:19.692 [INFO] [org.gradle.BuildLogger] Tasks to be executed: [task ':deletework', task ':getlaganwar', task ':unwar', task ':resignclientjars'] 

12:06:19.693 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Starting to execute task ':deletework' 
12:06:19.693 [DEBUG] [org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter] Determining if task ':deletework' is up-to-date 
12:06:19.694 [INFO] [org.gradle.api.internal.changedetection.ShortCircuitTaskArtifactStateRepository] Task ':deletework' has not declared any outputs, assuming that it is out-of-date. 
12:06:19.694 [DEBUG] [org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter] task ':deletework' is not up-to-date 

12:06:19.695 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter] Executing actions for task ':deletework'. 
12:06:19.695 [DEBUG] [org.gradle.api.internal.file.copy.DeleteActionImpl] Deleting D:\dev\util\java7-clientjars\workYYY 

12:06:19.934 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':deletework' 
12:06:19.934 [LIFECYCLE] [org.gradle.TaskExecutionLogger] :getlaganwar 
12:06:19.934 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Starting to execute task ':getlaganwar' 
12:06:19.936 [DEBUG] [org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter] Determining if task ':getlaganwar' is up-to-date 

12:06:19.942 [INFO] [org.gradle.api.internal.changedetection.DefaultTaskArtifactStateRepository] Executing task ':getlaganwar' due to: 
Output file D:\dev\util\java7-clientjars\workYYY for task ':getlaganwar' has changed. 
Output file D:\dev\util\java7-clientjars\workYYY\lagan.war has been removed for task ':getlaganwar'. 
12:06:19.942 [DEBUG] [org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter] task ':getlaganwar' is not up-to-date 

12:06:19.944 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter] Executing actions for task ':getlaganwar'. 

12:06:20.564 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':getlaganwar' 
12:06:20.565 [LIFECYCLE] [org.gradle.TaskExecutionLogger] :unwar 
12:06:20.565 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Starting to execute task ':unwar' 
12:06:20.586 [DEBUG] [org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter] Determining if task ':unwar' is up-to-date 
12:06:20.588 [DEBUG] [org.gradle.api.internal.changedetection.DefaultFileCacheListener] Can cache files for ZIP 'D:\dev\util\java7-clientjars\workYYY\lagan.war' 
12:06:20.588 [DEBUG] [org.gradle.api.internal.changedetection.DefaultFileCacheListener] Can cache files for file 'D:\dev\util\java7-clientjars\workYYY\lagan' 
12:06:24.096 [INFO] [org.gradle.api.internal.changedetection.DefaultTaskArtifactStateRepository] Executing task ':unwar' due to: 
Output file D:\dev\util\java7-clientjars\workYYY\lagan for task ':unwar' has changed. 

12:06:24.097 [DEBUG] [org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter] task ':unwar' is not up-to-date 

12:06:24.100 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter] Executing actions for task ':unwar'. 

12:06:27.863 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':unwar' 
12:06:27.863 [LIFECYCLE] [org.gradle.TaskExecutionLogger] :resignclientjars 
12:06:27.864 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Starting to execute task ':resignclientjars' 
12:06:27.864 [INFO] [org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter] Skipping task ':resignclientjars' as it has no source files. 
12:06:27.864 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':resignclientjars' 
12:06:27.864 [LIFECYCLE] [org.gradle.TaskExecutionLogger] :resignclientjars UP-TO-DATE 
12:06:27.865 [DEBUG] [org.gradle.execution.taskgraph.DefaultTaskGraphExecuter] Timing: Executing the DAG took 8.173 secs 
12:06:27.865 [LIFECYCLE] [org.gradle.BuildResultLogger] 
12:06:27.865 [LIFECYCLE] [org.gradle.BuildResultLogger] BUILD SUCCESSFUL 
12:06:27.865 [LIFECYCLE] [org.gradle.BuildResultLogger] 
12:06:27.866 [LIFECYCLE] [org.gradle.BuildResultLogger] Total time: 8.886 secs 

回答

3

构建脚本的问题不是任务依赖关系,而是resignclientjars的任务定义不正确。它正在配置阶段(即对于每个构建调用)执行其工作,而不是执行阶段的。正确的任务定义将如下所示:

task resignclientjars(dependsOn: unwar) { 
    doLast { 
     ... 
    } 
} 

可以与在Gradle User GuideGradle forums执行阶段在配置阶段读了。

4

您使用的摇篮1.5,mustRunAfter日期。目前的版本是1.8。

dependsOn不修复任务的任何顺序。这已经在各种错误报告中讨论过了。解决方法是在各个任务之间使用depencencies,或者使用mustRunAfter