后台:我有一个多项目Gradle构建,我已经定义了一个Gradle任务,它在Exec任务中运行JavaScript单元测试。此任务的输入是项目中的JavaScript文件,因此只有在修改其中一个源文件时才会重新运行。该任务将添加到主项目中的所有JavaScript项目中。
问题:我想对此进行扩展,以便在项目中的JavaScript文件或其任何项目依赖项中的JavaScript文件发生更改时重新运行测试。这怎么做得最好?
如果放在每个子项目构建文件中(在依赖声明之后),下面的代码可以工作,但我们有20多个JavaScript子项目,我想保持DRY。
project.ext.jsSourceFiles = fileTree("src/").include("**/*.js*")
task testJavaScript(type: Exec, dependsOn: configurations.js) {
inputs.files resolveJavascriptDependenciesFor(project)
outputs.file "report.xml"
// Run tests in JSTestDriver using command line call...
}
def resolveJavascriptDependenciesFor(project) {
def files = project.jsSourceFiles
project.configurations.js.allDependencies.each {
files = files + resolveJavascriptDependenciesFor(it.dependencyProject)
}
return files
}
有更好的解决方案吗?也许我自己不必解决所有文件依赖关系?
答案 0 :(得分:2)
如前面的答案所述,在子项目闭包中添加jsTest任务可以很容易地为每个子项目添加jstesting支持。我认为您可以通过将源文件声明为依赖项来简化输入设置:
dependencies {
js filetree("src/main").include("**/*.js")
}
和
subprojects { subproj ->
task testJavaScript(type: Exec, dependsOn: configurations.js) {
inputs.files subproj.configurations.js
outputs.file "report.xml"
commandLine ...
}
}
答案 1 :(得分:0)
可以做这样的事吗?
allprojects {project ->
task testJavaScript(type: Exec, dependsOn: configurations.js) {
inputs.files resolveJavascriptDependenciesFor(project)
// Run tests in JSTestDriver using command line call...
}
}
def resolveJavascriptDependenciesFor(project) {
def files = project.jsSourceFiles
project.configurations.js.allDependencies.each {
files = files + resolveJavascriptDependenciesFor(it.dependencyProject)
}
return files
}
任务是在所有项目上,并且将被递归调用。 不完全确定这是有效的,但我认为它的出路
答案 2 :(得分:0)
我找到了一个有效但不太好的解决方案,使用与问题相同的依赖规范。它是在主项目中以稍微不同的顺序加载gradle文件。
主人build.gradle
:
subprojects {
configurations {
js
}
// Apply the subproject's build.gradle, but with another name (that isn't automatically loaded)
if (project.file('depends.gradle').exists()) {
apply from: project.file('depends.gradle')
}
apply from: project.parent.file('javaScriptProjectTasks.gradle')
}
与之前的非工作主人build.gradle
subprojects {
configurations {
js
}
apply from: project.parent.file('javaScriptProjectTasks.gradle')
// The subproject's build.gradle is automatically loaded
}