我有一个多项目gradle配置。所以每个子项目都有一个build.gradle
,另一个我定义了一般任务。
基本上,在常规build.gradle
文件中,我列出了执行环境,每个环境都适用于production
,pre-production
,development
等目的。
我设置了几个定义类的容器:
class RemoteContainer {
String name
String container
String hostname
Integer port
String username
String password
String purpose
}
因此,我将容器设置purpose
字段的目的设置为'production'
,'pre-production'
或'development'
。
然后,我可以创建几个容器:
def developmentRemoteContainers = [
new RemoteContainer(
name: 'wildfly8',
container: 'wildfly8x',
hostname: '----',
port: ----,
username: '----',
password: '----'
purpose: 'development'
),
new RemoteContainer(
name: 'glassfish4',
container: 'glassfish4x',
hostname: '----',
port: ----,
username: '----',
password: '----'
purpose: 'development'
)
]
def preproductionRemoteContainers = [
new RemoteContainer(
name: 'wildfly8',
container: 'wildfly8x',
hostname: '----',
port: ----,
username: '----',
password: '----'
purpose: 'pro-production'
),
new RemoteContainer(
name: 'glassfish4',
container: 'glassfish4x',
hostname: '----',
port: ----,
username: '----',
password: '----'
purpose: 'pre-production'
)
]
def productionUserRemoteContainers = [
new RemoteContainer(
name: 'wildfly8',
container: 'wildfly8x',
hostname: '---',
port: ----,
username: '----',
password: '----'
purpose: 'production'
),
new RemoteContainer(
name: 'glassfish4',
container: 'glassfish4x',
hostname: '----',
port: ----,
username: '----',
password: '----'
purpose: 'production'
)
]
之后,我根据每个远程容器的内容创建任务:
示例任务:
remoteContainers.each { config ->
task "deployRemote${config.name.capitalize()}"(type: com.bmuschko.gradle.cargo.tasks.remote.CargoDeployRemote) {
description = "Deploys WAR to remote Web Application Server: '${config.name}'."
containerId = config.container
hostname = config.hostname
port = config.port
username = config.username
password = config.password
dependsOn war
}
task "undeployRemote${config.name.capitalize()}"(type: com.bmuschko.gradle.cargo.tasks.remote.CargoUndeployRemote) {
description = "Deploys WAR to remote Web Application Server: '${config.name}'."
containerId = config.container
hostname = config.hostname
port = config.port
username = config.username
password = config.password
}
}
因此,这就是我为每个容器创建部署和取消部署任务以及执行上下文的方式。
因为你能够找出每个任务取决于战争任务。所以,我的项目有一个包含${stringKey}
字符串的文件,我需要根据每个容器的目的替换它。
因此,${stringKey}
必须替换为config.purpose
。
修改
基本上有两个文件:
在/src/main/resources/META-INF/persistence.xml
下:此文件包含数据库服务器位置信息。根据服务器环境,数据库位置是IP / PORT / DATABASE ...例如:
<property name="hibernate.ogm.datastore.host" value="${ip}"/>
<property name="hibernate.ogm.datastore.port" value="${port}"/>
在/src/main/resources/configuration.settings.environtment
下:此文件仅包含此行scope = ${scope}
。
必须在war
代进行替换。
我绝对不知道该怎么做。 有什么想法吗?
答案 0 :(得分:0)
如果只需要替换占位符,你可以尝试这样的东西
tasks.taskName.doFirst {
exec {
commandLine "perl", "-pi","-w","-e","s/${stringKey}/"+config.purpose+"/g" ,"filePath"
}
}
}
答案 1 :(得分:0)
您可以使用ant.replace执行此操作:
replaceTokens << {
ant.replace(
file: "path/to/your/file",
token: "stringtoreplace",
value: config.purpose
)
}
war.dependsOn replaceTokens
答案 2 :(得分:0)
我遇到了一个类似的问题。我发现更容易保持单独的环境(例如dev,qa,staging,prod等)特定的属性/ settings / config,然后在构建生命周期中的适当时间加载/应用特定的环境。以下链接很有帮助:
PS:我回答了一个较旧的问题,但希望这些指针对面临类似问题的人有所帮助。