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?
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
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>
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.
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"/>
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.