如何正确引用蚂蚁任务中的路径?
Posted
技术标签:
【中文标题】如何正确引用蚂蚁任务中的路径?【英文标题】:How to properly quote a path in an ant task? 【发布时间】:2011-08-22 18:52:26 【问题描述】:我想在 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>
引用整个参数是行不通的,individual 路径需要单独引用。我正在修改的 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
。路径转换为每个路径调用映射器链。如果正则表达式匹配,则需要它,否则它需要标识。正则表达式只是说,如果我们发现一个没有空格的东西后面跟着一个至少有一个空格的东西,用双引号括起来。
【问题讨论】:
【参考方案1】:一种选择是使用“完整 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>
【讨论】:
您还可以在<mapper>
文档找到了解决方案。以上是关于如何正确引用蚂蚁任务中的路径?的主要内容,如果未能解决你的问题,请参考以下文章