如何正确引用ant任务中的路径?

时间:2011-05-10 20:08:02

标签: ant quotes proguard

我想在Ant中调用<proguard>任务,并且需要将路径传递给各种JAR文件,例如:相当于:

<proguard>
   -injars /some/path/jar1;/some other path/jar2
</proguard>

问题是,这些路径中的某些路径可能包含空格或特殊字符,必须像proguard manual中所解释的那样引用它们:

<proguard>
  -injars /some/path/jar1;"/some other path/jar2"
</proguard>

引用整个论点并不起作用,个别路径需要单独引用。我正在修改的ant文件使用属性将各种JAR路径传递给proguard,我的问题是如何正确引用-injars和-libraryjars的各个路径。例如:

<property name="libraryjars" refid="some.classpath" />
<proguard>
   @${proguard.config}
   -libraryjars  ${libraryjars}
</proguard>

我刚刚将属性修改为:

<property name="libraryjars.unquoted" refid="some.classpath"/>
<property name="libraryjars" value="'${libraryjars.unquoted}'"/>

但那仍然很脆弱,不是吗?有没有更好的办法?那么我有一个带有“path1; path2”属性的事实呢,我想拆分路径组件,单独引用它们并重新创建属性。我知道如何在shell脚本中执行此操作但是ant语法对我来说更加神秘:-)哦,当然它需要在所有平台上工作(至少Windows,Mac和Linux),处理事实路径分隔符发生了变化,但是确定在ant脚本中有一个常量。

[更新]感谢@ martin的回答,我找到了使用内部pathconvert mapper chain完成我想要的完美方式:

<pathconvert property="dest.path" refid="source.path">
  <firstmatchmapper>
    <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
    <identitymapper/>
  </firstmatchmapper>
</pathconvert>

这会将C:\path\jar 1;C:\my path\jar2;C:\path\jar3转换为"C:\path\jar 1";"C:\my path\jar2";C:\path\jar3。路径转换为每个路径调用映射器链。如果正则表达式匹配,则需要使用该标识符。 regexp简单地说,如果我们找到没有空格的东西,后跟至少有空格的东西,用双引号括起来。

1 个答案:

答案 0 :(得分:2)

一种选择是使用'全XML'proguard任务,然后每个jar将是一个单独的元素,但通常用于渲染属性的路径,您将使用Ant pathconvert task。例如:

<fileset id="some.classpath" dir=".">
    ...
</fileset>

<pathconvert property="injars.inner" refid="some.classpath" pathsep='"${path.separator}"' />
<property name="injars" value='"${injars.inner}"' />

注意添加前导和尾随双引号 - pathsep仅适用于路径的元素。 然后按照你提到的方式使用它:

<proguard>
  -injars ${injars}
</proguard>