Suche…


Syntax

  • groovy.util.Node = node.find {childNode -> return true || falsch
  • node.append (nodeYouWantAsAChild)
  • groovy.util.Node parsedNode = (neuer XmlParser ()). parseText (someRawXMLString)
  • '' 'mehrzeiliger String (nicht interpoliert)' ''

Bemerkungen

Auf die drei grundlegenden Dateien eines IntelliJ-Projekts - die Dateien ipr, iws und iml - kann wie in der Ideenaufgabe schrittweise zugegriffen werden

project.ipr
module.iml
workspace.iws

Mit der .withXml können Sie auf die XML-Datei zugreifen. Durch die Verwendung von .asNode () wird daraus ein grooviger XML-Knoten.

Ex:

project.ipr.withXml { provider ->
    def node = provider.asNode()

Von da aus ist es ziemlich einfach - Gradle zu ändern, um IntelliJ-Projekte für Sie zu konfigurieren, die Datei beim Start zu nehmen, die gewünschten Aktionen auszuführen (in IntelliJ) und dann die neue Datei mit der alten Datei zu vergleichen. Sie sollten sehen, welches XML Sie benötigen, um den Ideenauftrag anzupassen. Sie müssen auch beachten, wo sich die XML-Datei befindet.

Eine andere Sache, die Sie berücksichtigen sollten, ist, dass Sie keine doppelten Knoten in den IntelliJ-Dateien wünschen, wenn Sie die Gradle-Idee mehrmals ausführen. Sie möchten also nach dem Knoten suchen, den Sie erstellen möchten. Wenn er nicht vorhanden ist, können Sie ihn erstellen und einfügen.

Fallstricke:

Wenn bei der Suchmethode == für den Zeichenfolgenvergleich verwendet wird, schlägt dies manchmal fehl. Beim Testen und ich finde, dass dies der Fall ist, verwende ich .contains.

Bei der Suche nach Knoten haben nicht alle Knoten das Attribut, das Sie als Kriterien verwenden. Überprüfen Sie daher unbedingt den Wert null.

Fügen Sie eine Grundkonfiguration hinzu

Annahmen für dieses Beispiel:

  • Sie haben eine Klasse, foo.bar.Baz .
  • Sie möchten eine Laufkonfiguration erstellen, die die Hauptmethode ausführt.
  • Es ist in einem Modul namens fooBar .

In deiner Gradle-Datei:

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}"
        }
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow