在 gradle 脚本中调用 ant 任务

Calling ant task within gradle script

通常我们使用 SAP-Hybris ant 结构来构建我们的系统。当我们用它构建 docker 图像时,它变得有点复杂,所以我们想用 gradle

包装所有这些
ant.importBuild "${ProjectBaseDir}/bin/platform/build.xml"

repositories {
    jcenter()
}

task run() {
    doLast {
        exec {
            workingDir "${ProjectBaseDir}/bin/platform"
            executable "./hybrisserver.sh"
        }
    }
}

这是我们做的第一步.. 在 gradle 中导入 ant 脚本,这样我们也可以在 gradle 中使用所有任务。 构建 docker 图像的下一步(在蚂蚁方面)将是:

ant production -Dproduction.include.tomcat=false -Dproduction.legacy.mode=false -Dtomcat.legacy.deployment=false -Dproduction.create.zip=false

接着是

ant createPlatformImageStructure
docker build -t platform .

我正在考虑定义一个新任务

task buildImage {
    dependsOn 'production'
    dependsOn 'createPlatformImageStructure'
    doLast {
       // do the docker stuff
    }
}

但是我如何合并参数(ant production -Dproduction.include.tomcat=false -Dproduction.legacy.mode=false -Dtomcat.legacy.deployment=false -Dproduction.create.zip=false 到 'production'?

更新:

Ant 属性现在是这样处理的:

task dockerimage (dependsOn : production) {
    doFirst {
        ant.properties['production.include.tomcat'] = false
        ant.properties['production.legacy.mode'] = false
        ant.properties['tomcat.legacy.deployment'] = false
        ant.properties['production.create.zip'] = false
    }

仍然没有运气。当 ant 是 运行 none 这些设置中有

Ant 的属性将处理为:

ant.properties['production.include.tomcat'] = false

问题出在混合结构中。

我还必须从 Gradle 执行平台 ant 命令。我构建了一个包装器而不是导入脚本。它工作正常,所以我希望它对你有用。包装器是跨平台的。

文件:

  • scripts/ant.sh - 在 Unix/Linux
  • 上执行平台 ant 二进制文件
#!/usr/bin/env sh
(
    . ./setantenv.sh
    echo ''
    echo Executing: ant $@
    echo ''
    ant $@
)
  • scripts/ant.bat - 在 Windows
  • 上执行平台 ant 二进制文件
@echo off
setlocal
call setantenv.bat
echo:
echo Executing: ant %*
echo:
ant %*
endlocal
  • gradle/platformScript.gradle - 执行平台脚本(我只实现了 ant,但你可以添加更多)
import org.gradle.internal.os.OperatingSystem

void platformScript(def parameters) {
    def script = parameters['script'] ?: 'ant'
    def arguments = parameters['arguments']
    if (!(arguments instanceof Collection)) {
        arguments = [arguments]
    }

    def args = []
    def extension
    if (OperatingSystem.current().isWindows()) {
        args << 'cmd'
        args << '/c'
        extension = 'bat'
    } else {
        extension = 'sh'
    }

    def scriptFile = "${rootProject.rootDir}/scripts/${script}.${extension}"
    if (!scriptFile.exists()) {
        throw new IllegalArgumentException("Script \"${script}\" does not exist! Full path: ${scriptFile.absolutePath}")
    }
    args << scriptFile.absolutePath

    if (OperatingSystem.current().isWindows()) {
        for (def argument in arguments) {
            def index = argument.indexOf('=')
            if (index == -1) {
                args << argument
            } else {
                def name = argument.substring(0, index)
                def value = argument.substring(index + 1).replace('\"', '\"\"')
                args << "${name}=\"${value}\""
            }
        }
    } else {
        args.addAll(arguments)
    }

    exec {
        workingDir "${ProjectBaseDir}/bin/platform"
        commandLine args
    }
}

ext {
    platformScript = this.&platformScript
}

示例build.gradle

apply from: "${rootProject.rootDir}/gradle/platformScript.gradle"

task cleanPlatform() {
    doFirst {
        // executes: ant clean
        platformScript arguments: 'clean'
    }
}
tasks.clean.dependsOn('cleanPlatform')

task production() {
    doFirst {
        // executes: ant production -Dproduction.include.tomcat=false ...
        platformScript arguments: [
            'production',
            '-Dproduction.include.tomcat=false',
            '-Dproduction.legacy.mode=false',
            '-Dtomcat.legacy.deployment=false',
            '-Dproduction.create.zip=false'
        ]
    }
}