Скрипт Gradle: как создавать и записывать данные в файл XML - PullRequest
1 голос
/ 08 мая 2019

Я создаю xml и использую скрипт gradle и записываю некоторые данные в xml файл. Я создал файл .gradle и после запуска файла gradle я не могу получить точный формат для файла XML. Я публикую свой код ниже: Пожалуйста, кто-нибудь направит меня. import groovy.xml.MarkupBuilder

task generatepublicxml {

    //def resDir = project.projectDir.absolutePath + "/src/main/res-public"

    // Create new public.xml with writer
    new File("/home/signity/Desktop/public.xml").withWriter { writer ->
        // Create MarkupBuilder with 4 space indent
        def destXml = new MarkupBuilder(new IndentPrinter(writer, "    ", true));
        def destXmlMkp = destXml.getMkp();

        // GIST NOTE: our project needed the ResourceName suppression, but its not needed in general
        destXml.resources('xmlns:tools': 'http://schemas.android.com/tools', 'tools:ignore': 'ResourceName')
                {
            // Leave file comment
            destXmlMkp.yield "\r\n"
            destXmlMkp.comment("AUTO-GENERATED FILE.  DO NOT MODIFY. public.xml is generated by the generatepublicxml gradle task")

        }
    }
}

Мой необходимый формат файла:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="remoteAccessConsumerKey">3MVG92mNMNiWvonjPDM9qqaDip0MFl9TGc</string>
    <string name="oauthRedirectURI">saleschap:///mobilesdk/detect/oauth/done</string>

    <string-array name="oauthScopes">
        <item>api</item>
        <item>web</item>
        <item>refresh_token</item>
    </string-array>

    <string name="androidPushNotificationClientId"></string>

</resources>

1 Ответ

2 голосов
/ 08 мая 2019

Поскольку я вижу, что вы делаете это из файла сборки gradle, сначала обратите внимание на фазы выполнения gradle.

Я бы предположил, что вы хотите, чтобы ваш код запускался при выполнении задачи, а не при загрузке файла сборки.Если это так, вам нужно поместить код в блок doFirst или doLast внутри задачи.Если вы напишите свой код, как в вашем вопросе, код будет выполняться при загрузке файла сборки, независимо от того, запущена ли задача generatepublicxml или нет (т. Е. Вы можете запустить какую-то совершенно другую задачу, и код все равно будет выполняться).

Это часто не очевидно при запуске с gradle, и я бы порекомендовал прочитать документы gradle по жизненному циклу сборки , если это не совсем понятно.

С учетом этого, следующий build.gradle:

import groovy.xml.*

task generatepublicxml {
  doLast { 
    file("public.xml").withWriter { writer ->
      // Create MarkupBuilder with 4 space indent
      def xml = new MarkupBuilder(new IndentPrinter(writer, "    ", true))

      xml.doubleQuotes = true
      xml.mkp.xmlDeclaration(version: '1.0', encoding: 'utf-8')

      xml.resources('xmlns:tools': 'http://schemas.android.com/tools', 'tools:ignore': 'ResourceName') {
        string(name: 'remoteAccessConsumerKey', '3MVG92mNMNiWvonjPDM9qqaDip0MFl9TGc')
        string(name: 'oauthRedirectURI',        'saleschap:///mobilesdk/detect/oauth/done')
        'string-array'(name: 'oauthScopes') {
          item('api')
          item('web')
          item('refresh_token')
        }
        string(name: 'androidPushNotificationClientId')

        // Leave file comment
        mkp.yield('\n    ')
        mkp.comment("AUTO-GENERATED FILE.  DO NOT MODIFY. public.xml is generated by the generatepublicxml gradle task")

      }
    }
  }
}

при запуске:

~> gradle generatepublicxml

BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

приводит к следующему public.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="ResourceName">
    <string name="remoteAccessConsumerKey">3MVG92mNMNiWvonjPDM9qqaDip0MFl9TGc</string>
    <string name="oauthRedirectURI">saleschap:///mobilesdk/detect/oauth/done</string>
    <string-array name="oauthScopes">
        <item>api</item>
        <item>web</item>
        <item>refresh_token</item>
    </string-array>
    <string name="androidPushNotificationClientId" />
    <!-- AUTO-GENERATED FILE.  DO NOT MODIFY. public.xml is generated by the generatepublicxml gradle task -->
</resources>

Если вам не нужен атрибут xmlns и т. Д. Для элемента resources, вы можете просто сделать:

xml.resources {
...
}

, что приведет к:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   ...
...