Как убрать basedir из абсолютного пути, чтобы получить относительный путь? - PullRequest
24 голосов
/ 08 января 2010

В 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 ]

44 голосов
/ 21 января 2011

Начиная с Ant 1.8.0, вы можете использовать для этого атрибут relative задачи Ant 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}" />

Приводит к:

 [echo] /home/.../stack_overflow/ant/my_project/some_dir
 [echo] my_project/some_dir
7 голосов
/ 23 июня 2011

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

<pathconvert property="relative.dir">
  <path location="${somepath}"/>
  <globmapper from="${basedir}/*" to="./*" />
</pathconvert>
3 голосов
/ 30 апреля 2010

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

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

Возвращаемое значение - "здесь". Это только кажется, что дает вам последний каталог, который может не получить достаточно того, что вы хотите.

1 голос
/ 29 октября 2012

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

0 голосов
/ 08 января 2010

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

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

и

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