【问题标题】:Force Ant to substitue a substitution variable强制 Ant 替换一个替换变量
【发布时间】:2016-09-19 16:29:55
【问题描述】:

我使用基于ant脚本的软件(Drops)。

我尝试动态生成要复制的文件的目标路径。为此,我执行了一个 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 用它的值替换替换变量?

【问题讨论】:

    标签: ant ant-contrib


    【解决方案1】:

    不完全清楚您要做什么。 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>
    

    【讨论】:

    • 我添加了更多信息。我想要做的是动态生成我想要复制文件的路径。我使用 propertycopy 在属性列表中选择一个路径。这工作正常。我的问题是 ${environment.props.environment_name} 没有被它的值替换。
    • @YLombardi 我不明白你的要求。我也不清楚为什么需要使用 propertycopy,这是核心 ANT 不支持的任务。
    • Propertycopy 不是问题,它按预期工作。我的问题是 ant 没有用它的值替换 ${environment.props.environment_name} 变量。
    【解决方案2】:

    我认为我在 ant 文档中找到了我的问题的答案: https://ant.apache.org/manual/properties.html

    通常属性值不能更改,一旦设置了属性,大多数任务将不允许修改其值。

    对于我使用的软件:Drops,它在环境属性之前加载了应用程序属性。

    所以 application.props.target.gmao 是在 environment.props.environment_name 之前设置的,并且 ${environment.props.environment_name} 不能被替换。

    我的问题的答案似乎是否定的,不可能强制 Ant 用它的值替换替换变量。 如果变量以正确的顺序加载,它会自动完成。

    【讨论】:

      猜你喜欢
      • 2020-04-11
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多