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

bla*_*ube 24 ant relative-path

在我的项目的build.xml中,我定义了一个属性:

<property name="somedir.dir" location="my_project/some_dir"/>
Run Code Online (Sandbox Code Playgroud)

价值${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>
Run Code Online (Sandbox Code Playgroud)

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

mar*_*ton 43

从Ant 1.8.0开始,您可以使用relativeAnt property任务的属性.

例如:

<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}" />
Run Code Online (Sandbox Code Playgroud)

导致:

 [echo] /home/.../stack_overflow/ant/my_project/some_dir
 [echo] my_project/some_dir
Run Code Online (Sandbox Code Playgroud)


小智 7

一个稍微简洁的解决方案是指定somepath内部<pathconvert>:

<pathconvert property="relative.dir">
  <path location="${somepath}"/>
  <globmapper from="${basedir}/*" to="./*" />
</pathconvert>
Run Code Online (Sandbox Code Playgroud)


Ano*_*ous 0

location使用项目的basedir. 所以我认为value选项可以让你更好地控制:

<property name="base.dir" value="/home/myuser"/>
Run Code Online (Sandbox Code Playgroud)

<property name="somedir.dir" value="${base.dir}/some_dir"/>
Run Code Online (Sandbox Code Playgroud)

  • 是的。但正如你所看到的,我使用的是“value”而不是“location”。因此,如果将 `base.dir` 设置为 `/home/blah`,将 `somedir.dir` 设置为 `mydirectory`,那么您将分别拥有它们,并且绝对路径将为 `${base.dir}/$ {somedir.dir}`。为什么使用选项位置将绝对路径压缩到“base.dir”中,然后寻找从中提取工作目录的方法? (2认同)
  • 如果您自己设置变量,则为 true,但如果它作为其他任务的输出怎么办? (2认同)