具有2个蚂蚁目标的Gradle任务 - 尝试组合蚂蚁目标以加快执行时间

时间:2017-08-31 10:33:15

标签: intellij-idea gradle ant build.gradle mapper

我目前有一个使用2个蚂蚁目标的Gradle任务(复制和移动)。这2个蚂蚁任务给了我正确的结果。但是,我想知道是否有可能将它们加入一个蚂蚁目标,以加快执行时间并减少代码量。

我试图用2个映射器做到这一点,但我显然只能使用一个映射器。我曾尝试使用chainedmapper和compositemapper,但结果并非我的预期。

我想要什么

我有一些文件需要更改其所有扩展程序(.icls -> .xml),我有一个文件要重命名(ChroMATERIAL IntelliJ IDEA -> ChroMATERIAL)

Starting file name                    final file name
------------------                    ---------------
ChroMATERIAL - Darker.icls        ->  ChroMATERIAL - Darker.xml
ChroMATERIAL - Darcula.icls       ->  ChroMATERIAL - Darcula.xml
ChroMATERIAL IntelliJ IDEA.icls   ->  ChroMATERIAL.xml

以下代码是我在收到错误消息之前最初尝试使用的代码。最后的代码是我目前使用的解决方法。

编辑:我更喜欢基于蚂蚁的成绩任务。我已经查看了基于纯蚂蚁的文件,这些文件似乎允许多个映射器,这就是我认为我需要的,但我无法得到类似的工作。

我尝试了什么

task syncFiles {

    doLast {

        // Sync files from IntelliJ's color scheme and rename extension
        ant.copy(todir: sourceDir) {
            ant.fileset(dir: intelliJColorSchemeDir)

            // NOTE: This is an error message. Can only have one mapper!
            ant.mapper(type: "glob", from: "*.icls", to: "*.xml")
            ant.mapper(type: "glob", from: "ChroMATERIAL IntelliJ IDEA.xml", to: "ChroMATERIAL.xml")    
        }
    }
}

我目前的实施

这就是我想用2个映射器变成一个ant任务。我相信这可以变成只能调用ant一次的更细的代码。我希望这段代码执行得更快一些。

task syncFiles {

    doLast {

        // Sync files from IntelliJ's color scheme and rename extension
        ant.copy(todir: sourceDir) {
            ant.fileset(dir: intelliJColorSchemeDir)
            ant.mapper(type: "glob", from: "*.icls", to: "*.xml")
        }

        // Rename one specific file. I want this mapper to be joined with the above mapper
        ant.move(todir: sourceDir) {
            ant.fileset(dir: sourceDir)
            ant.mapper(type: "glob", from: "ChroMATERIAL IntelliJ IDEA.xml", to: "ChroMATERIAL.xml")
        }
    }
}

2 个答案:

答案 0 :(得分:1)

task syncFiles(type: Copy) {
    into sourceDir
    with copySpec {
       from intelliJColorSchemeDir
       include '**/ChroMATERIAL IntelliJ IDEA.icls'
       rename '.*', 'ChroMATERIAL.xml'
    }
    with copySpec {
       from intelliJColorSchemeDir
       exclude '**/ChroMATERIAL IntelliJ IDEA.icls'
       rename '(.*)\\.icls$', '$1.xls'
    }
}

答案 1 :(得分:1)

通过坚持原始问题并提供基于Ant的解决方案,以下代码似乎是最干净的。可能有其他类型的复合映射器表现更好,但这是我能想到的。

    ant.copy(todir: sourceDir) {
        ant.fileset(dir: intelliJColorSchemeDir)
        ant.firstmatchmapper {
            ant.globmapper(from: "ChroMATERIAL IntelliJ IDEA.icls", to: "ChroMATERIAL.xml")
            ant.globmapper(from: "*.icls", to: "*.xml")
        }
    }

我喜欢的东西。代码非常干净,不使用奇怪的语法,如正则表达式。它还将映射器组合成一个块。最后,它像我原本想要的那样使用Ant。

执行一些快速测试似乎表明执行时间变化很小,但我已经使用上面的代码报告了此任务的一些最快执行时间。不知道这是侥幸还是稍快一点​​。

编辑:

以下是仅使用Gradle的简洁版本。

into sourceDir
from intelliJColorSchemeDir, {
    rename 'ChroMATERIAL IntelliJ IDEA.icls','ChroMATERIAL.xml'  // Edit: moved to top and changed file extension.
    rename '(.*)\\.icls$', '$1.xml'

}

此代码实际上在每次运行时都会更快。