强制 Ant 替换变量替换
Force Ant to substitue a substitution variable
我用的是一个基于ant脚本的软件(滴滴)
我尝试动态生成要复制的文件的目标路径。为此,我执行 linux 命令行。
在我的应用程序中,我有以下属性:
- environment.props.environment_name=recette
- application.props.target.gmao=/opt/${environment.props.environment_name}/gmao-ws
我希望 Ant 在运行时用它的值替换 ${environment.props.environment_name}。但事实并非如此。
这是我写的 Ant 脚本:
<project xmlns:drops="antlib:com.arcadsoftware.mmk.anttasks" name="deployJar" basedir="." default="main">
<taskdef resource="net/sf/antcontrib/antlib.xml"/>
<taskdef resource="com/dropssoftware/drops/ant/antlib.xml"/>
<loadDropsContext/>
<target name="main">
<!-- get the value of the property "application.props.target.gmao" -->
<propertycopy name="target.dir" from="application.props.target.gmao"/>
<!-- I expect this to print target.dir=/opt/recette/gmao-ws but it print target.dir=/opt/${environment.props.environment_name}/gmao-ws -->
<echoproperties />
<!-- Supposed to copy from /opt/drops/storage/afile.jar to /opt/recette/gmao-ws but the property "target.dir" is wrong -->
<exec executable="sudo">
<arg value="/bin/cp"/>
<arg value="${param.artifacts.root}/${param.jar.root}"/>
<arg value="${target.dir}"/>
</exec>
</target>
</project>
有了这个输入:
- param.env=gmao
- param.artifacts.root=/opt/drops/storage/
应该将文件从 artifacts 目录复制到 /opt/recette/gmao-ws 目录。但是 Ant 试图将它复制到 /opt/${environment.props.environment_name}/gmao-ws.
我不明白为什么 Ant 不用它的值替换 ${environment.props.environment_name}。
是否可以强制 Ant 用其值替换替换变量?
不完全清楚您要做什么。 propertycopy 任务不是普通 Ant 的一部分,来自名为 ant-contrib
的第 3 方扩展
我怀疑您尝试做的事情可以通过正常的 属性 替换来完成。我提供了一个例子。
例子
如何通过设置属性将参数传递给构建文件的简单示例:
$ ant -Dparam.from=AAA -Dparam.to=BBB
build:
[echo]
[echo] sudo
[echo] /bin/cp
[echo] /opt/drops/storage/AAA
[echo] /opt/drops/storage/BBB
[echo]
build.xml
注意顶部声明的 3 个属性了吗?这些实际上是可用于覆盖的默认值。
<project name="demo" default="build">
<property name="param.artifacts.root" value="/opt/drops/storage"/>
<property name="param.from" value="fromDir"/>
<property name="param.to" value="toDir"/>
<target name="build">
<echo>
sudo
/bin/cp
${param.artifacts.root}/${param.from}
${param.artifacts.root}/${param.to}
</echo>
</target>
</project>
我想我在 ant 文档中找到了问题的答案:
https://ant.apache.org/manual/properties.html
Normally property values can not be changed, once a property is set, most tasks will not allow its value to be modified.
就我使用的软件而言:Drops,它在环境属性之前加载了应用程序属性。
因此 application.props.target.gmao 设置在 environment.props.environment_name 之前,${environment.props.environment_name} 无法替换。
我的问题的答案似乎是否定的,不可能强制 Ant 用它的值替换替换变量。
如果变量以正确的顺序加载,它会自动完成。
我用的是一个基于ant脚本的软件(滴滴)
我尝试动态生成要复制的文件的目标路径。为此,我执行 linux 命令行。
在我的应用程序中,我有以下属性:
- environment.props.environment_name=recette
- application.props.target.gmao=/opt/${environment.props.environment_name}/gmao-ws
我希望 Ant 在运行时用它的值替换 ${environment.props.environment_name}。但事实并非如此。
这是我写的 Ant 脚本:
<project xmlns:drops="antlib:com.arcadsoftware.mmk.anttasks" name="deployJar" basedir="." default="main">
<taskdef resource="net/sf/antcontrib/antlib.xml"/>
<taskdef resource="com/dropssoftware/drops/ant/antlib.xml"/>
<loadDropsContext/>
<target name="main">
<!-- get the value of the property "application.props.target.gmao" -->
<propertycopy name="target.dir" from="application.props.target.gmao"/>
<!-- I expect this to print target.dir=/opt/recette/gmao-ws but it print target.dir=/opt/${environment.props.environment_name}/gmao-ws -->
<echoproperties />
<!-- Supposed to copy from /opt/drops/storage/afile.jar to /opt/recette/gmao-ws but the property "target.dir" is wrong -->
<exec executable="sudo">
<arg value="/bin/cp"/>
<arg value="${param.artifacts.root}/${param.jar.root}"/>
<arg value="${target.dir}"/>
</exec>
</target>
</project>
有了这个输入:
- param.env=gmao
- param.artifacts.root=/opt/drops/storage/
应该将文件从 artifacts 目录复制到 /opt/recette/gmao-ws 目录。但是 Ant 试图将它复制到 /opt/${environment.props.environment_name}/gmao-ws.
我不明白为什么 Ant 不用它的值替换 ${environment.props.environment_name}。
是否可以强制 Ant 用其值替换替换变量?
不完全清楚您要做什么。 propertycopy 任务不是普通 Ant 的一部分,来自名为 ant-contrib
的第 3 方扩展我怀疑您尝试做的事情可以通过正常的 属性 替换来完成。我提供了一个例子。
例子
如何通过设置属性将参数传递给构建文件的简单示例:
$ ant -Dparam.from=AAA -Dparam.to=BBB
build:
[echo]
[echo] sudo
[echo] /bin/cp
[echo] /opt/drops/storage/AAA
[echo] /opt/drops/storage/BBB
[echo]
build.xml
注意顶部声明的 3 个属性了吗?这些实际上是可用于覆盖的默认值。
<project name="demo" default="build">
<property name="param.artifacts.root" value="/opt/drops/storage"/>
<property name="param.from" value="fromDir"/>
<property name="param.to" value="toDir"/>
<target name="build">
<echo>
sudo
/bin/cp
${param.artifacts.root}/${param.from}
${param.artifacts.root}/${param.to}
</echo>
</target>
</project>
我想我在 ant 文档中找到了问题的答案: https://ant.apache.org/manual/properties.html
Normally property values can not be changed, once a property is set, most tasks will not allow its value to be modified.
就我使用的软件而言:Drops,它在环境属性之前加载了应用程序属性。
因此 application.props.target.gmao 设置在 environment.props.environment_name 之前,${environment.props.environment_name} 无法替换。
我的问题的答案似乎是否定的,不可能强制 Ant 用它的值替换替换变量。 如果变量以正确的顺序加载,它会自动完成。