2010-01-08 7 views
23

В 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

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

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

и

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

Я думаю, вы неправильно поняли мой вопрос. У меня уже есть заданный путь «$ {base.dir}/some_dir», и мне нужно получить относительный путь «./some_dir». – blackicecube

+0

Зачем вам нужно извлекать 'some_dir', когда вы его используете в' $ {somedir.dir} '? – Anonymous

+0

$ {somedir.dir} будет что-то вроде «/ home/blah/mydirectory», и что задает вопрос, как получить от него только «./mydirectory». Поэтому вы не можете просто использовать $ {somedir.dir}. В nant есть множество функций, построенных в виде path :: get-directory-name Но я не могу найти, если они существуют в Ant. Я также нуждаюсь в том, как это сделать. – christophercotton

3

Вы можете быть в состоянии использовать Ant basename task. Если у вас есть:

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

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

+1

Это то, что я хотел ... 4 года спустя. – mfa

43

Начиная с 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 
+1

Обратите внимание, что атрибут «basedir» также очень полезен, поскольку он позволяет использовать другой каталог, чем базовый каталог по умолчанию. Благодарим вас за то, что вы показали нам это решение, это намного проще и надежнее, чем использование картографа с некоторыми регулярными выражениями. – gouessej

7

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

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

Это был подход, который работал хорошо для меня в 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 = «истинный» очень важно в globmapper, он не работал для меня в противном случае, независимо от того, сколько я возился с вперед/обратной косой черты. (Я делаю все мои косые черты, как вперед в своих скриптах ant, так что я могу запускать их в unixy-системах.) Моя версия Ant - 1.8.1.

Смежные вопросы