Comment supprimer le basedir d'un chemin absolu pour obtenir un chemin relatif?

Dans la construction.xml de mon projet j'ai une propriété définie:

<property name="somedir.dir" location="my_project/some_dir"/>

La valeur ${somedir.dir} va être un chemin absolu: /home/myuser/my_project/some_dir.

ce dont j'ai besoin est juste le chemin relatif ./my_project/some_dir sans ${basedir} valeur /home/myuser. Comment puis-je y parvenir en utilisant Ant?

Jusqu'à présent j'ai trouvé une solution en convertissant la propriété en un chemin puis en utilisant "pathconvert", mais je ne pense pas que ce soit une bonne solution:

<path id="temp.path">
    <pathelement location="${somedir.dir}" />
</path>
<pathconvert property="relative.dir" refid="temp.path">
    <globmapper from="${basedir}/*" to="./*" />
</pathconvert>

tout autre (plus élégant) des suggestions?

24
demandé sur Alex 2010-01-08 09:45:24

5 réponses

Depuis Ant 1.8.0 vous pouvez utiliser le relative attribut de La Fourmi property tâche pour cela.

Par exemple:

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

mène à:

 [echo] /home/.../stack_overflow/ant/my_project/some_dir
 [echo] my_project/some_dir
43
répondu martin clayton 2011-01-21 18:32:48

une solution légèrement moins verbeuse serait de spécifier somepath à l'intérieur <pathconvert>:

<pathconvert property="relative.dir">
  <path location="${somepath}"/>
  <globmapper from="${basedir}/*" to="./*" />
</pathconvert>
7
répondu Garns 2011-06-23 19:20:23

Vous pourriez être en mesure d'utiliser la Fourmi basename tâche. Si vous avez:

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

la valeur qui fait écho est "ici". Il semble seulement vous donner le répertoire final, qui pourrait ne pas obtenir assez de ce que vous voulez.

3
répondu christophercotton 2011-01-21 18:20:51

location élargit automatiquement le chemin à l'aide de basedir. Donc, je pense que value option vous donne un meilleur contrôle:

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

et

<property name="somedir.dir" value="${base.dir}/some_dir"/>
0
répondu Anonymous 2010-01-08 14:53:58

C'est l'approche qui a bien fonctionné pour moi sous Windows, adapté de @Garns réponse:

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

je pense que handledirsep= "true" est assez important dans globmapper, cela n'a pas fonctionné pour moi autrement peu importe à quel point j'ai bricolé avec l'avant/backslashs. (Je fais tous mes slashes comme forward dans mes scripts ant juste pour pouvoir les exécuter sur des systèmes unixy.) Ma version de Ant est 1.8.1.

0
répondu DWoldrich 2012-10-28 23:56:34