4

背景:マルチプロジェクトのGradleビルドがあり、ExecタスクでJavaScript単体テストを実行するGradleタスクを定義しました。このタスクへの入力はプロジェクト内のJavaScriptファイルであるため、ソースファイルの1つが変更された場合にのみ再実行されます。タスクは、マスタープロジェクトからすべての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 に答える