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

时间:2012-10-01 15:45:46

标签: javascript dependencies gradle scripting-language

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

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

3 个答案:

答案 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
}