2017-01-20 131 views
2

约摇篮(3.3版)如何解决在多项目设置任务相关性(用java子项目)一个小问题。我是很新的,所以也许摇篮这是一个愚蠢的问题...摇篮dependson与defaultTasks在多项目

我想实现一个任务被编译前一个编译后的执行和。

使用它按预期工作defaultTasks。但是,当用dependsOn定义任务时,它不会。

我的根build.gradle文件看起来像这样:

defaultTasks 'a', 'classes', 'b' 

task a { 
    doLast { 
     println 'before compile' 
    } 
} 

task b { 
    doLast { 
     println 'after compile' 
    } 
} 

task doIt(dependsOn: [a, 'classes', b]) { 
    doLast { 
     println('done!') 
    } 
} 

allprojects { 
    group = 'foo' 

    repositories { 
     mavenCentral() 
     maven { 
      url 'https://maven.atlassian.com/3rdparty/' 
     } 
    } 
} 

subprojects { 
    ext { 
     springVersion = '4.3.5.RELEASE' 
    } 
    apply plugin: 'java' 
    dependencies { 
     compile fileTree(dir: 'lib', include: '*.jar') 
     testCompile group: 'junit', name: 'junit', version: '4.12' 
    } 
} 

当我执行gradle预期默认任务执行:我得到“前编”,那么所有的子项目进行编译,然后“编译后”。

当我执行gradle doIt我收到以下错误消息

Task with path 'classes' not found in root project 'teambits-core'. 

任何想法,为什么是这样的话?

回答

1

有了您的build.gradle,因为它是,刚刚运行“gradle这个”给我的3.3安装了同样的错误。

有你在这里面临2个问题。

1.多项目子项目VS allprojects

的第一个问题是,defaultTasks在主的build.gradle定义,但你的Java插件只包含在子项目。

在一个多项目构建中,'master'项目不是子项目部分的一部分(只有所有项目都会影响主项目),但是'defaultTasks'是在顶层定义的,所以运行'gradle'将会调用主项目中的defaultTasks,并在类任务上失败,因为它不加载java插件。

为了解决这个问题,移动“应用插件”线allprojects(但仅限于该图中,正常情况下你不希望在主加载Java插件,因为它通常是关于建立分项目)。

2. defaultTasks VS dependsOn

第二个问题(假设您移动应用插件),那么你会打defaultTasks和dependsOn的真正区别。

的defaultTasks运行顺序的任务指定:

$ gradle 
:a 
before compile 
:compileJava UP-TO-DATE 
:processResources UP-TO-DATE 
:classes UP-TO-DATE 
:b 
after compile 

BUILD SUCCESSFUL 

Total time: 0.765 secs 

但随着列表顺序运行doIt方法会导致gradle这个按字母顺序运行它们(因为它们之间存在,在这种情况下没有依赖它会按字母顺序运行)。与mustRunAfter

在这种情况下

$ gradle doit 
:a 
before compile 
:b 
after compile 
:compileJava UP-TO-DATE 
:processResources UP-TO-DATE 
:classes UP-TO-DATE 
:doIt 
done! 

BUILD SUCCESSFUL 

Total time: 0.733 secs 

修复相关性顺序,您可以通过添加修复它下面到doIt方法:

task doIt(dependsOn: [a, 'classes', b]) { 
    b.mustRunAfter(':classes') 
    doLast { 
     println('done!') 
    } 
} 

这将迫使在B任务稍后完成。

+0

感谢您的详细解答,马克!特别是.mustRunAfter是非常有帮助的。 – Axel

+0

@Axel - 很高兴我能帮上忙。我确实发现了你的问题,因为我有类似的问题,并且在解决我的问题时,它也解决了你的问题。 –

+0

这就是这些双赢局面之一:-) – Axel