2009-02-25 15 views
6

Sono nuovo di NAnt e sono stato in grado di creare un <target> cheNAnt directory di output personalizzati <msbuild>

1) cancella qualsiasi codice della cartella corrente

2) Esporta codice di fresco da SVN

3) costruisce il codice nella directory di default, che è la cartella PrecompiledWeb (sua una web app)

Eccolo:

<target name="export" description="export code from svn"> 
    <delete dir="${Delete.Dir}"></delete> 
    <exec program="svn" commandline="export ${MySVN.Repos} ${MySVN.Dest}" /> 
    <msbuild project="${Solution.Filename}"> 
     <property name="Configuration" value="Release"/> 
    </msbuild> 
</target> 

Desidero specificare una directory di output personalizzata (diversa da "PrecompiledWeb"). È possibile e potresti mostrarmi la tag/proprietà necessaria?

Grazie!

EDIT

Grazie a Scott e Si, mi sto avvicinando a una soluzione, ma io ancora non hanno tutto ciò che funziona. I commenti mi hanno portato a questo articolo su MSBuild's Output Path Property. Usando il loro codice:

<?xml version="1.0"?> 
<project name="test" default="build" basedir="." xmlns="http://nant.sf.net/schemas/nant-0.84.win32.net-1.0.xsd"> 
    <target name="build"> 
     <exec program="${framework::get-framework-directory('net-3.5')}/msbuild.exe"> 
      <arg value="${Full.Path}\Code\MySolution.sln" /> 
      <arg value="/p:OutputPath=${Full.Path}\Output\" /> 
     </exec> 
    </target> 
</project> 

Questo funzionerà correttamente; tuttavia, nella mia soluzione che contiene un sito Web e una libreria di classi, pubblica la DLL della libreria di classi sul percorso di output specificato, ma è ancora pubblica il sito Web effettivo nella cartella predefinita di PrecompiledWeb.

Qualcuno ha qualche suggerimento su come modificare il percorso della cartella PrecompiledWeb da NAnt?

Grazie ancora a tutti coloro che hanno aiutato!

Edit 2 Soluzione Finale

Ecco quello che ho finalmente potuto ottenere lavoro (aggiornato per NET 4):

<exec program="${framework::get-framework-directory('net-4.0')}/msbuild.exe"> 
    <arg value="${Full.Path}\Code\MySolution.sln" /> 
    <arg value="/t:Rebuild" /> 
    <arg value="/t:ResolveReferences" /> 
    <arg value="/t:_CopyWebApplication" /> 
    <arg value="/p:OutDir=${Build.Output}bin\" /> 
    <arg value="/p:WebProjectOutputDir=${Build.Output}" /> 
    <arg value="/p:Configuration=Release" /> 
</exec> 
+0

Se si utilizza un progetto di distribuzione Web è possibile definire OutputPath per la tutto il sito Oltre a questo, forse dovrai approfondire gli script Microsoft MSBuild? – si618

risposta

8

si può specificare e ignorare alcune delle proprietà per msbuild. Per specificare la directory di output, eseguire l'override della proprietà OutputDir.

<target name="export" description="export code from svn"> 
     <delete dir="${Delete.Dir}" /> 
     <exec program="svn" commandline="export ${MySVN.Repos} ${MySVN.Dest}" /> 
     <msbuild project="${Solution.Filename}"> 
      <property name="Configuration" value="Release"/> 
      <property name="OutputDir" value="${Output.Dir}"/> 
     </msbuild> 
</target> 
+0

Forse sto facendo qualcosa di sbagliato, ma anche dopo aver aggiunto quel tag di proprietà, esso continua a essere pubblicato nella cartella PrecompiledWeb all'interno della cartella della soluzione. Hai idea del perché questo possa essere? Grazie per il tuo aiuto a prescindere. –

+0

Questa è una soluzione web? –

+0

Ahh ... ho appena visto nella tua risposta che è davvero un'app web. –

7

appena avuto una rapida occhiata ad un progetto, fa OutputPath invece di OutputDir aiuto?

Un'altra opzione potrebbe essere un progetto di distribuzione Web, che mi piace perché chiama aspnet_compiler e il compilatore C#, quindi raccoglie problemi che altrimenti potrebbero mancare fino alla distribuzione.

4

uno script di build per uno dei nostri progetti usa questo comando per pubblicare un applicazione web:

msbuild.exe /t:_CopyWebApplication /p:Configuration=Release /p:OutDir=.\..\published\ /p:WebProjectOutputDir=.\..\published 

(La directory corrente è impostato su directory del progetto della web app, a questo punto, che è il motivo per cui non Csproj il file è specificato. L'intera soluzione è già stata ricostruita in precedenza nello script.

Con il suono di esso, WebProjectOutputDir potrebbe essere la proprietà che è necessario.

/t: _CopyWebApplication potrebbe anche essere importante. Non ho usato NAnt quindi non so se è possibile passare questo parametro con l'attività msbuild. Potrebbe essere necessario utilizzare un'attività exec, come in questo esempio: http://www.netomatix.com/development/wapwithnant.aspx. Questo esempio sembra ricostruire e copiare tutto in una volta.

1

Una fonte di confusione è che si stanno miscelando due sistemi di generazione distinti. Il tuo obiettivo NAnt sta delegando tutto il lavoro per capire come pubblicare la tua applicazione web sul file della soluzione, quindi per estensione ai file csproj a cui fa riferimento.

I file csproj sono file MsBuild, quindi probabilmente dovresti cercare lì come indirizzare l'output del tuo progetto. This post by dave^2 potrebbe essere utile su questo problema.

Puoi pubblicare la tua applicazione web ovunque tu voglia utilizzando NAnt, purché stia facendo la pubblicazione. Puoi fare lo stesso con MsBuild. La causa del tuo dilemma è che NAnt è non che fa la pubblicazione in questo caso e stai permettendo al file csproj di determinare la posizione della tua directory web. Quindi, ignorare il file csproj e fare in modo che NAnt (o MsBuild) pubblichi il codice; oppure modificare il file csproj per pubblicare l'applicazione Web dove si desidera; oppure crea una seconda posizione per la tua applicazione web e pubblicala anche utilizzando lo strumento di creazione.

AFAIK, queste opzioni sono esaurienti.

0

Hmm, non so come farlo con MSBuild in Nant, ma utilizzando NAnt, ho fatto in precedenza in questo modo:

<solution solutionfile="${build.dir}\solution.sln"> 
    <webmap> 
     <map url="http://localhost/somdir/project.csproj" 
      path="c:\inetpub\wwwroot\somelocaldir" /> 
    <webmap> 
</solution> 

Ma poi, si sta utilizzando la soluzione NAnt' 'task off-point invece di usare MSBuild direttamente.

modifica: Sto anche dando un'occhiata ad alcune opzioni di msbuild; Se si imposta OutDir & OutputPath sullo stesso valore, cosa succede?

+0

Grazie, ma questo è un progetto .NET 3.5 e non credo che il tag supporti .NET 3.5. –

3

Quando si utilizza l'operazione, il nome della proprietà corretto è OutDir, non OutputDir:

<msbuild project="${Solution.Filename}"> 
     <property name="Configuration" value="Release"/> 
     <property name="OutDir" value="${Output.Dir}"/> 
    </msbuild> 
0

provare qualcosa di simile:

<property name="nant.settings.currentframework" value="net-3.5"/>  
<msbuild project="${Solution.Filename}"> 
    <property name="Configuration" value="Release"/> 
    <property name="OutDir" value="${Full.Path}\Output\\"/> 
    <property name="WebProjectOutputDir" value="${Full.Path}\Output\Web\\"/> 
</msbuild> 
Problemi correlati