gradle
Personalizzazione dell'attività IDEA IntelliJ
Ricerca…
Sintassi
- groovy.util.Node = node.find {childNode -> return true || falso}
- node.append (nodeYouWantAsAChild)
- groovy.util.Node parsedNode = (nuovo XmlParser ()). parseText (someRawXMLString)
- '' 'stringa a più linee (non interpolata)' ''
Osservazioni
I tre file di base di un progetto IntelliJ - ipr, iws e iml - sono accessibili come gradle nel task idea tramite
project.ipr
module.iml
workspace.iws
usando il .withXml puoi accedere a xml. Usando il .asNode () su quello si trasforma in un nodo xml groovy.
Ex:
project.ipr.withXml { provider ->
def node = provider.asNode()
Da lì è piuttosto semplice - modificare gradle per configurare i progetti IntelliJ per te, prendere il file all'avvio, eseguire le azioni che desideri gradle (all'interno di IntelliJ), quindi diffare il nuovo file con il vecchio file. Dovresti vedere quale XML ti servirà per personalizzare il lavoro idea. Dovrai anche prendere nota di dove si trova il xml.
Un'altra cosa da considerare è che non si desidera duplicare i nodi all'interno dei file IntelliJ se si esegue l'idea gradle più volte. Quindi, dovrai cercare il nodo che desideri creare e, se non è lì, puoi crearlo e inserirlo.
insidie:
A volte, quando si usa == per il confronto delle stringhe nel metodo find, fallisce. Quando collaudo e trovo che sia il caso, io uso .contains.
Durante la ricerca di nodi, non tutti i nodi hanno l'attributo che stai utilizzando come criterio, quindi assicurati di verificare la presenza di null.
Aggiungi una configurazione di esecuzione di base
Presupposti per questo esempio:
- Hai una classe,
foo.bar.Baz
. - Vorresti creare una configurazione di esecuzione che esegua il metodo principale.
- È in un modulo chiamato
fooBar
.
Nel tuo file 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}"
}
}
}