javascript – 使用项目依赖项的输入定义Gradle任务?

背景:我有一个多项目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
}

有更好的解决方案吗?也许我自己不必解决所有文件依赖关系?

最佳答案 如前面的答案中所述,在子项目闭包中添加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  ...
    }    
}
点赞