gradle
Personalización de tareas IDEA IntelliJ
Buscar..
Sintaxis
- groovy.util.Node = node.find {childNode -> return true || falso
- node.append (nodeYouWantAsAChild)
- groovy.util.Node parsedNode = (new XmlParser ()). parseText (someRawXMLString)
- '' 'cadena de línea múltiple (no interpolada)' ''
Observaciones
Se puede acceder a los tres archivos básicos de un proyecto IntelliJ (los archivos ipr, iws e iml) como en Gradle en la tarea de idea a través de
project.ipr
module.iml
workspace.iws
el uso de .withXml le permite acceder al xml. Usar el .asNode () en que lo convierte en un nodo xml maravilloso.
Ex:
project.ipr.withXml { provider ->
def node = provider.asNode()
Desde allí es bastante simple: modificar gradle para configurar los proyectos de IntelliJ por usted, tomar el archivo como se inicia, realizar las acciones que le gustaría que Gradle realice (dentro de IntelliJ) y luego difuminar el archivo nuevo con el archivo antiguo. Debería ver qué XML necesitará para personalizar el trabajo de la idea. También deberás tomar nota de dónde se encuentra el xml.
Otra cosa a considerar es que no desea nodos duplicados dentro de los archivos IntelliJ si ejecuta la idea de gradle varias veces. Por lo tanto, querrá buscar el nodo que desea crear y, si no está allí, puede crearlo e insertarlo.
Escollos:
A veces, cuando se usa == para la comparación de cadenas en el método de búsqueda, falla. Cuando estoy probando y encuentro que ese es el caso, uso .contains.
Al buscar nodos, no todos los nodos tienen el atributo que está utilizando como criterio, así que asegúrese de verificar si hay nulos.
Agregar una configuración de ejecución básica
Suposiciones para este ejemplo:
- Tienes una clase,
foo.bar.Baz
. - Le gustaría crear una configuración de ejecución que ejecute el método principal.
- Está en un módulo llamado
fooBar
.
En tu archivo de gradle:
idea {
workspace.iws.withXml { provider ->
// I'm not actually sure why this is necessary
def node = provider.asNode()
def runManager = node.find { [email protected]('RunManager')}
// find a run configuration if it' there already
def runner = runManager.find { it.find ({ mainClass ->
return mainClass.@name != null && mainClass.@name == "MAIN_CLASS_NAME" && mainClass.@value != null && [email protected]('Baz');
}) != null }
// create and append the run configuration if it doesn't already exists
if (runManager != null && runner == null){
def runnerText = '''
<configuration default="false" name="Baz" type="Application" factoryName="Application" nameIsGenerated="true">
<extension name="coverage" enabled="false" merge="false" runner="idea">
<pattern>
<option name="PATTERN" value="foo.bar.Baz" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<option name="MAIN_CLASS_NAME" value="foo.bar.Baz" />
<option name="VM_PARAMETERS" value="" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
<option name="ENABLE_SWING_INSPECTOR" value="false" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<module name="foobar" />
<envs />
<method />
</configuration>'''
runner = (new XmlParser()).parseText(runnerText)
runManager.append(config);
}
// If there is no active run configuration, set the newly made one to be it
if (runManager != null && runManager.@selected == null) {
runManager.@selected="${runner.@factoryName}.${runner.@name}"
}
}
}