Подтвердить что ты не робот

Как удалить базовый путь с абсолютного пути, чтобы получить относительный путь?

В файле 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>

Любые другие (более элегантные) предложения?

4b9b3361

Ответ 1

Так как Ant 1.8.0, вы можете использовать для этого relative атрибут Ant property task.

Например:

<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

Ответ 2

Немного менее подробное решение будет указывать somepath внутри <pathconvert>:

<pathconvert property="relative.dir">
  <path location="${somepath}"/>
  <globmapper from="${basedir}/*" to="./*" />
</pathconvert>

Ответ 3

Возможно, вы сможете использовать задачу Ant basename. Если у вас есть:

<property name="somedir" value="/path/to/file/here" />
<basename file="${somedir}" property="somebasedir" />
<echo>${somebasedir}</echo>

Значение, которое получает эхо, это "здесь". Кажется, это дает вам окончательный каталог, который может не хватить того, что вы хотите.

Ответ 4

location автоматически расширяет путь, используя проект basedir. Поэтому я думаю, что опция value дает вам лучший контроль:

<property name="base.dir" value="/home/myuser"/>

и

<property name="somedir.dir" value="${base.dir}/some_dir"/>

Ответ 5

Это был подход, который хорошо работал у меня в 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>

Я думаю, что handledirsep = "true" очень важен в globmapper, это не сработало для меня иначе, независимо от того, насколько я возился с форвардом/обратной косой чертой. (Я делаю все мои косые черты как прямые в моих сценариях ant, чтобы я мог запускать их в unixy-системах.) Моя версия ant - 1.8.1.