Pregunta

Fondo: Tengo una compilación de Gradle para múltiples proyectos y definí una tarea de Gradle que ejecuta pruebas unitarias de JavaScript en una tarea ejecutiva.Las entradas para esta tarea son los archivos JavaScript del proyecto, por lo que solo se vuelve a ejecutar si se modifica uno de los archivos fuente.La tarea se agrega a todos los proyectos de JavaScript desde un proyecto maestro.

Pregunta: Quiero extender esto para que las pruebas se vuelvan a ejecutar si los archivos JavaScript en el proyecto, o en cualquiera de sus dependencias del proyecto están cambiados.¿Cuál es la mejor manera de hacer esto?

El siguiente código funciona si se coloca en cada archivo de compilación de subproyecto (después de la declaración de dependencia), pero tenemos más de 20 subproyectos de JavaScript y me gustaría permanecer SECO.

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
}

¿Existe una solución mejor?¿Quizás donde no tenga que resolver todas las dependencias de archivos yo mismo?

¿Fue útil?

Solución

Como se escribió en la respuesta antes, agregar la tarea JSTest dentro de un cierre de subproyectos haría muy fácil agregar el soporte de JSTesting para cada subproyecto.Creo que puede aliviar su configuración de insumos al declarar los archivos de origen como dependencias:

dependencies {
     js filetree("src/main").include("**/*.js")
}

y

subprojects { subproj ->
    task testJavaScript(type: Exec, dependsOn: configurations.js) {
        inputs.files subproj.configurations.js
        outputs.file "report.xml"

        commandLine  ...
    }    
}

Otros consejos

¿Sería posible hacer algo así?

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
}

Tha Way La tarea está en todos los proyectos, y se llamará recursivamente. No está completamente seguro de que esto funciona, pero creo que es la forma de ir

Encontré una solución que funciona pero no es excelente, usando la misma especificación de dependencia que en la pregunta.Es para cargar los archivos gradle en un orden ligeramente diferente en el proyecto maestro.

Maestro 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')
}

Comparar con el anterior, no funciona maestro build.gradle

subprojects {
    configurations {
        js
    }

    apply from: project.parent.file('javaScriptProjectTasks.gradle')
    // The subproject's build.gradle is automatically loaded
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top