2009-04-16 15 views
6

Estoy empezando a usar NAnt. Estaba trabajando en un tutorial, y solo tratando de establecer un objetivo para limpiar mi solución en la compilación. Mi estructura de solución de Visual Studio es la siguiente:Cómo configurar el directorio de trabajo en NAnt?

  • carpeta de soluciones
    • Carpeta del proyecto
    • Carpeta del proyecto
    • Carpeta Herramientas
      • de NAnt carpeta

El archivo NAnt .exe reside en la carpeta Tools/NAnt. Mi archivo .build también está allí. Aquí está mi archivo .build:

<?xml version="1.0" encoding="utf-8" ?> 
<project name="NAntTest" default="build" xmlns="http://nant.sf.net/release/0.86-beta1/nant.xsd"> 
    <property name="solution.file.name" value="NAntTest.sln" /> 
    <property name="project.config" value="debug" /> 

    <target name="build" depends="clean.source" /> 

    <target name="clean.source"> 
    <exec program="${framework::get-framework-directory(framework::get-target-framework())}\msbuild.exe" 
      commandline="${solution.file.name} /t:Clean /p:Configuration=${project.config} /v:q" 
      workingdir="."/> 
    </target> 

</project> 

Así es como se formateó el ejemplo que estoy siguiendo. Si trato de ejecutar esta compilación, aparece un error que indica que el archivo del proyecto no existe. En el objetivo clean.source, si reemplazo el atributo workingdir con una ruta codificada a mi carpeta de solución base, el script se compila y se ejecuta correctamente. Obviamente, esto no es ideal para la portabilidad si necesito mover el proyecto a cualquier lugar.

¿Cómo obtengo NAnt para ver el directorio base de trabajo?

Respuesta

7

Mi recomendación es colocar siempre el archivo de compilación en el nivel de solución. Entonces, todas las rutas relativas en el archivo de compilación serán iguales a las de la solución.

+0

Moviendo esto hasta el directorio de soluciones funcionó. ¡Gracias por la ayuda! –

+0

¿Hm, un voto a favor? ¿Por qué? –

+1

Funcionará, pero el consejo no es exactamente el correcto. Simplemente configure basedir apropiadamente. (Por cierto, no fui yo quien votó negativamente). – BrainSlugs83

2

Puede intentar establecer el atributo basedir del nodo del proyecto. Esto puede resolver su problema.

<project name="NAntTest" default="build" basedir="C:\Code\MyProject" xmlns="http://nant.sf.net/release/0.86-beta1/nant.xsd"> 
+1

Probablemente debería establecer el basedir con una ruta relativa (es decir, ".. \ .."). – BrainSlugs83

+0

Esta es la respuesta correcta, junto con el comentario para usar una ruta relativa. –

1

Si configura el atributo detallado del nant exec task, escupirá la línea de comando exacta que generó. No estoy seguro de cuál es su problema específico con respecto a la ejecución de msbuild. En su lugar, he estado usando el nantcontrib msbuild task.

7

No cabe función para cambiar el directorio actual orden interna, pero se puede crear uno en un bloque de script:

<target name="foo"> 
    <echo message="Current directory set to ${directory::set-current-directory('C:')}"/> 
    <echo message="Current directory is now ${directory::get-current-directory()}"/> 
    </target> 

    <script language="C#" prefix="directory"> 
    <code><![CDATA[ 
    [Function("set-current-directory")] 
    public static string SetCurrentDirectory(string path) 
    { 
     System.IO.Directory.SetCurrentDirectory(path); 
     return path; 
    } 
    ]]></code> 
    </script> 

Por supuesto, se debe evitar confiar en el directorio actual en las secuencias de comandos o en su código .

0

Ahora existe un atributo workingdir que puede definir en su elemento exec.

De acuerdo con documentation, workingdir hace referencia a "El directorio en el que se ejecutará el comando".

0

Como tarea en lugar de una función:

<?xml version="1.0"?> 
<project name="test" default="build"> 
    <script language="C#" prefix="path" > 
     <code> 
      <![CDATA[ 
      [TaskName("set-current-directory")] 
      public class SetCurrentDirectory : Task { 
       private string _path; 

       [TaskAttribute("path", Required=true)] 
       public string Path { 
        get { return _path; } 
        set { _path = value; } 
       } 

       protected override void ExecuteTask() { 
        System.IO.Directory.SetCurrentDirectory(_path);; 
       } 
      } 
      ]]> 
     </code> 
    </script> 

    <target name="build"> 
     <set-current-directory path="c:\Program Files" /> 
     <echo message="${directory::get-current-directory()}" /> 
    </target> 
</project> 

Salida:

$ nant 

build: 

    [echo] c:\Program Files 
Cuestiones relacionadas