2009-04-16 27 views
6

Ho appena iniziato a utilizzare NAnt. Stavo lavorando a un tutorial e stavo solo cercando di impostare un obiettivo per pulire la mia soluzione su build. Il mio visivo struttura Studio Solution è la seguente:Come impostare la directory di lavoro in NAnt?

  • cartella della soluzione
    • cartella di progetto
    • cartella di progetto
    • Strumenti Folder
      • NAnt cartella

Il file NAnt .exe si trova nella cartella Tools/NAnt. Il mio file .build è anche lì. Ecco il mio file .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> 

Ecco come è stato formattato l'esempio che sto seguendo. Se provo a eseguire questa build, viene visualizzato un errore che indica che il file di progetto non esiste. Nel target clean.source, se sostituisco l'attributo workingdir con un percorso codificato nella cartella della soluzione di base, lo script viene compilato ed eseguito correttamente. Ovviamente, questo non è l'ideale per la portabilità se ho bisogno di spostare il progetto ovunque.

Come posso ottenere NAnt per vedere la directory di lavoro di base?

risposta

7

La mia raccomandazione è di posizionare sempre il file di costruzione a livello di soluzione. Quindi tutti i percorsi relativi nel file di build saranno uguali a quelli della soluzione.

+0

Lo spostamento nella directory della soluzione ha funzionato. Grazie per l'aiuto! –

+0

Hm, un downvote? Perché? –

+1

Funzionerà, ma voglio dire, il consiglio non è esattamente valido. Basta impostare basedir in modo appropriato. (Btw, non ero me che downvoted.) – BrainSlugs83

2

Si potrebbe provare a impostare l'attributo basedir del nodo del progetto. Questo potrebbe risolvere il tuo problema.

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

Probabilmente si dovrebbe impostare il basedir utilizzando un percorso relativo (vale a dire ".. \ .."). – BrainSlugs83

+0

Questa è la risposta corretta, insieme al commento per utilizzare un percorso relativo. –

1

Se si imposta l'attributo verboso del nant exec task, esso sputerà la riga di comando esatta generata. Non sei sicuro di quale sia il problema specifico relativo all'esecuzione di msbuild: ho utilizzato invece lo nantcontrib msbuild task.

7

Non v'è funzione built per cambiare la directory corrente, ma è possibile crearne uno in un blocco di 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> 

Naturalmente, si dovrebbe evitare di fare affidamento sulla directory corrente negli script o nel codice .

0

C'è ora un attributo workingdir che è possibile definire sull'elemento exec.

Secondo lo documentation, workingdir fa riferimento a "La directory in cui verrà eseguito il comando.".

0

Come un compito invece di una funzione:

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

uscita:

$ nant 

build: 

    [echo] c:\Program Files 
Problemi correlati