2009-02-25 15 views
6

Soy nuevo en Nant y han sido capaces de crear un <target> cualesde NAnt directorio de salida <msbuild> encargo

1) Elimina cualquier código de la carpeta actual

2) Exportaciones código fresca desde SVN

3) construye el código en el directorio por defecto que es la carpeta PrecompiledWeb (es una aplicación web)

Aquí está:

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

Quiero especificar un directorio de salida personalizado (que no sea "PrecompiledWeb"). ¿Es esto posible y podría mostrarme la etiqueta/propiedad necesaria?

¡Gracias!

EDITAR

Gracias a Scott y Si, me estoy acercando a una solución, pero todavía no tienen nada que funcione. Los comentarios me llevaron a este artículo en MSBuild's Output Path Property. Usando su código:

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

Esto se ejecutará con éxito; sin embargo, en mi solución, que contiene un sitio web y una biblioteca de clases, publica el dll de biblioteca de clases en la ruta de salida especificada, pero todavía publica el sitio web real en la carpeta PrecompiledWeb predeterminada.

¿Alguien tiene alguna sugerencia sobre cómo cambiar la ruta de la carpeta PrecompiledWeb de NAnt?

¡Gracias de nuevo a todos los que han ayudado!

Editar 2 Solución Final

Esto es lo que finalmente fue capaz de conseguir trabajo (actualizado para .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

Si utiliza un proyecto de implementación web se puede definir OutputPath para el todo el sitio web. Aparte de eso, ¿quizás necesites profundizar en los scripts de Microsoft MSBuild? – si618

Respuesta

8

uno puede especificar y anular algunas de las propiedades de msbuild. Para especificar el directorio de salida, anule la propiedad 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

Tal vez estoy haciendo algo mal, pero incluso después de agregar esa etiqueta de propiedad, todavía se publica en la carpeta PrecompiledWeb dentro de la carpeta de la solución. ¿Tienes alguna idea de por qué esto puede ser? Gracias por tu ayuda a pesar de todo. –

+0

¿Es esta una solución web? –

+0

Ahh ... acabo de ver en su respuesta que se trata de una aplicación web. –

7

acaba de tener un rápido vistazo a un proyecto, qué OutputPath en lugar de OutputDir ayuda?

Otra opción podría ser un proyecto de implementación web, que me gusta porque llama a aspnet_compiler así como al compilador de C#, por lo que detecta problemas que de lo contrario podrías perder hasta la implementación.

4

Un script de construcción para uno de nuestros proyectos utiliza este comando para publicar una aplicación web:

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

(El directorio actual se ajusta a directorio de proyectos de la aplicación web en este punto, por lo que no .csproj archivo especificado. Toda la solución ya se ha reconstruido anteriormente en el script.)

Por el sonido de la misma, WebProjectOutputDir podría ser la propiedad que necesita.

/t: _CopyWebApplication también puede ser importante. No he usado NAnt, así que no sé si puede pasar este parámetro con la tarea msbuild. Es posible que necesite utilizar una tarea ejecutiva, como en este ejemplo: http://www.netomatix.com/development/wapwithnant.aspx. Este ejemplo parece reconstruir y copiar todo de una vez.

1

Una fuente de confusión es que está mezclando dos sistemas de compilación distintos. Su objetivo NAnt está delegando todo el trabajo de averiguar cómo publicar su aplicación web en el archivo de solución, y por lo tanto, por extensión, a los archivos csproj a los que hace referencia.

Los archivos csproj son archivos MsBuild, por lo que probablemente deba buscar allí cómo dirigir la salida de su proyecto. This post by dave^2 podría ser útil en ese tema.

Puede publicar su aplicación web donde desee con NAnt, siempre que esté publicando. Puedes hacer lo mismo con MsBuild. La causa de su dilema es que NAnt es y no haciendo la publicación en este caso, y está dejando que el archivo csproj determine la ubicación de su directorio web. O bien omite el archivo csproj y haga que NAnt (o MsBuild) publique el código; o modifique el archivo csproj para publicar la aplicación web donde desee; o cree una segunda ubicación para su aplicación web y publíquela allí también utilizando su herramienta de compilación.

AFAIK, esas opciones son exhaustivas.

0

Hmm, no sé cómo hacerlo con MSBuild en Nant, pero el uso de NAnt, lo he hecho con anterioridad como esto:

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

Pero entonces, usted está utilizando la solución de NAnt' 'tarea pendiente en lugar de usar MSBuild directamente.

editar: También estoy echando un vistazo a algunas opciones de msbuild; Si configura OutDir & OutputPath en el mismo valor, ¿qué ocurre?

+0

Gracias, pero este es un proyecto .NET 3.5 y no creo que la etiqueta sea compatible con .NET 3.5. –

3

Cuando se utiliza la tarea, el nombre correcto de la propiedad es OutDir, no OutputDir:

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

Pruebe algo como esto:

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