4

背景:我有一个多项目 Gradle 构建,并且我定义了一个 Gradle 任务,它在 Exec 任务中运行 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
}

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

4

3 回答 3

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  ...
    }    
}
于 2012-10-01T20:07:50.157 回答
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
}

这样任务就在所有项目上,并且将被递归调用。不完全确定这行得通,但我认为这是要走的路

于 2012-10-01T18:06:27.633 回答
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
}
于 2012-10-02T14:13:01.773 回答