如何从绝对路径中剥离basedir以获得相对路径?

时间:2010-01-08 06:45:24

标签: ant relative-path

在我的项目的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>

还有其他(更优雅)的建议吗?

5 个答案:

答案 0 :(得分:44)

从Ant 1.8.0开始,您可以使用Ant property taskrelative属性。

例如:

<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"/>