【问题标题】:Gradle task with 2 ant targets - trying to combine ant targets to speed up execution time具有 2 个 ant 目标的 Gradle 任务 - 尝试组合 ant 目标以加快执行时间
【发布时间】:2018-02-09 06:48:19
【问题描述】:

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

我曾尝试使用 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

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

编辑:我确实更喜欢基于蚂蚁的等级任务。我查看了似乎允许多个映射器的纯 ant 文件,这是我认为我需要的,但我无法获得类似的工作。

我尝试了什么

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

【问题讨论】:

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


    【解决方案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'
    
    }
    

    这段代码实际上每次运行都更快。

    【讨论】:

    • 我会把rename 'ChroMATERIAL IntelliJ IDEA.icls','ChroMATERIAL.xml'放在第一位,而不是让它被重命名两次。你也不需要include '**'
    【解决方案2】:
    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'
        }
    }
    

    【讨论】:

    • 我最初确实做了一个成绩复制任务。我出于某种原因更改了它。我将不得不看看为什么。我真的不喜欢 dotIndex 和 ext 变量。他们真的把代码弄乱了。我认为我的原始代码相似但更干净。你知道如何用 gradles ant task 做到这一点吗?这个问题的一部分也是为了学习如何在 Gradle 中执行 ant 任务。
    • 已更新,第二次尝试更干净
    • 代码还是太多了。我在下面贴了一段使用Ant的代码sn-p,非常简洁。
    • Gradle 的 Copy 任务具有最新检查的好处,这是您无法从 ant 版本中获得的(除非您明确设置任务输入/输出)。最终结果是,如果自上次复制以来没有任何变化,我的版本将被跳过,您的版本将始终进行复制。
    • 我添加了一个 Gradle only Copy 任务,它非常快速简洁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    相关资源
    最近更新 更多