在 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'
]
}
}
通常我们使用 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'
]
}
}