在我的项目的build.xml中,我定义了一个属性:
<property name="somedir.dir" location="my_project/some_dir"/>
${somedir.dir}
的值将是绝对路径:/home/myuser/my_project/some_dir
。
我需要的只是没有./my_project/some_dir
值${basedir}
的相对路径/home/myuser
。如何使用Ant实现此目的?
到目前为止,我通过将属性转换为路径然后使用“pathconvert”找到了解决方案,但我不认为这是一个很好的解决方案:
<path id="temp.path">
<pathelement location="${somedir.dir}" />
</path>
<pathconvert property="relative.dir" refid="temp.path">
<globmapper from="${basedir}/*" to="./*" />
</pathconvert>
还有其他(更优雅)的建议吗?
答案 0 :(得分:44)
从Ant 1.8.0开始,您可以使用Ant property
task的relative
属性。
例如:
<property name="somedir.dir" location="my_project/some_dir"/>
<echo message="${somedir.dir}" />
<property name="somedir.rel" value="${somedir.dir}" relative="yes" />
<echo message="${somedir.rel}" />
导致:
[echo] /home/.../stack_overflow/ant/my_project/some_dir
[echo] my_project/some_dir
答案 1 :(得分:7)
稍微简洁的解决方案是在somepath
内指定<pathconvert>
:
<pathconvert property="relative.dir">
<path location="${somepath}"/>
<globmapper from="${basedir}/*" to="./*" />
</pathconvert>
答案 2 :(得分:3)
您可以使用Ant basename
task。如果你有:
<property name="somedir" value="/path/to/file/here" />
<basename file="${somedir}" property="somebasedir" />
<echo>${somebasedir}</echo>
得到回应的价值是“这里”。它似乎只给你最终目录,这可能无法满足你想要的目标。
答案 3 :(得分:1)
这种方法在Windows中适用于我,改编自@Garns回答:
<path id="uploadFilePath">
<fileset dir="${wcm.folderName}">
<include name="*" />
<exclude name="*.attr" />
</fileset>
</path>
<pathconvert property="relFilelist">
<path refid="uploadFilePath" />
<mapper>
<globmapper from="${wcm.folderName}/*" to="*" handledirsep="true" />
</mapper>
</pathconvert>
我认为handleirsep =“true”在globmapper中非常重要,不管我多少用前进/反斜杠摆弄它都不适用于我。 (我在我的ant脚本中做了所有斜线,因此我可以在unixy系统上运行它们。)我的Ant版本是1.8.1。
答案 4 :(得分:0)
location
使用项目的basedir
自动展开路径。所以我认为value
选项可以让您更好地控制:
<property name="base.dir" value="/home/myuser"/>
和
<property name="somedir.dir" value="${base.dir}/some_dir"/>