2010-01-08 22 views
23

En el build.xml de mi proyecto que tienen una propiedad definida:Cómo quitar la base de una ruta absoluta para obtener una ruta relativa?

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

El valor de ${somedir.dir} habrá una ruta absoluta: /home/myuser/my_project/some_dir.

Lo que necesito es solo la ruta relativa ./my_project/some_dir sin el valor ${basedir}/home/myuser. ¿Cómo puedo lograr esto usando Ant?

Hasta ahora he encontrado una solución mediante la conversión de la propiedad a un camino y luego usar "pathconvert", pero no creo que esto es una buena solución:

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

Cualquier otro (más elegantes) sugerencias ?

Respuesta

0

location expande automáticamente la ruta usando el proyecto basedir. Así que creo que value opción le da un mejor control:

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

y

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

Creo que malinterpretaste mi pregunta. Ya tengo un camino determinado "$ {base.dir}/some_dir" y necesito obtener la ruta relativa "./some_dir". – blackicecube

+0

¿Por qué necesita extraer 'some_dir' cuando lo tiene en' $ {somedir.dir} '? – Anonymous

+0

$ {somedir.dir} sería algo como "/ home/blah/mydirectory" y lo que la pregunta está haciendo es cómo obtener solo "./mydirectory" de él. Entonces no puedes usar $ {somedir.dir}. In nant hay un conjunto de funciones integradas como path :: get-directory-name Pero parece que no puedo encontrarlas si existen en Ant. También necesito saber cómo hacer esto. – christophercotton

3

es posible que pueda utilizar la hormiga basename task. Si tiene:

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

El valor que se hace eco es "aquí". Solo parece darte el directorio final, que puede no tener suficiente de lo que deseas.

+1

ESTO ES lo que quería ... 4 años después. – mfa

43

Desde Ant 1.8.0 puede utilizar el atributo relative del Ant property task para esto.

Por ejemplo:

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

lleva a:

[echo] /home/.../stack_overflow/ant/my_project/some_dir 
[echo] my_project/some_dir 
+1

Tenga en cuenta que el atributo "basedir" también es muy útil, ya que permite utilizar otro directorio que no sea el directorio base predeterminado. Gracias por mostrarnos esta solución, es mucho más fácil y más confiable que usar un mapeador con algunas expresiones regulares. – gouessej

7

una solución ligeramente menos detallado sería especificando somepath dentro <pathconvert>:

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

Este fue el enfoque que funcionaba bien para mí en Windows, adaptado de @Garns respuesta:

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

creo que handledirsep = "true" es bastante importante en globmapper, no funcionó para mí de lo contrario, no importa lo mucho que manipuló adelante/barras invertidas. (Hago todas mis barras como adelante en mis scripts de hormigas solo para poder ejecutarlas en sistemas unixy.) Mi versión de Ant es 1.8.1.

Cuestiones relacionadas