2010-05-25 14 views
70

Tengo VS 2010 instalado y estoy en proceso de modificar mi script MSBuild para nuestra integración de compilación TeamCity. Todo está funcionando bien con una excepción.MSBuild Script y VS2010 publican aplicación Web.config Transform

¿Cómo puedo saber MSBuild que quiero aplicar el Web.conifg archivos de transformación que he creado cuando publico la acumulación ...

tengo los siguientes elementos que produce la página web compilado pero, se genera un archivo Web.config, Web.Debug.config y, Web.Release.config (Todos 3) en el directorio de salida compilado. En el estudio cuando realizo una publicación al sistema de archivos que va a hacer la transformación y sólo la salida de Web.config con los cambios apropiados ...

<Target Name="CompileWeb"> 
    <MSBuild Projects="myproj.csproj" Properties="Configuration=Release;" /> 
</Target> 

<Target Name="PublishWeb" DependsOnTargets="CompileWeb"> 
    <MSBuild Projects="myproj.csproj" 
    Targets="ResolveReferences;_CopyWebApplication" 
    Properties="WebProjectOutputDir=$(OutputFolder)$(WebOutputFolder); 
       OutDir=$(TempOutputFolder)$(WebOutputFolder)\;Configuration=Release;" /> 
</Target> 

Cualquier ayuda sería grande ..!

Sé que esto puede hacerse por otros medios, pero me gustaría hacer esto utilizando el nuevo VS 2010 camino si es posible

Respuesta

62

Estaba buscando información similar y no la encontré, así que busqué en los archivos .targets que vienen con Visual Studio 2010 y MSBuild 4.0. Pensé que era el mejor lugar para buscar la tarea MSBuild que realizaría la transformación.

Por lo que yo he sido capaz de decir, se utiliza la siguiente tarea MSBuild:

<Project ToolsVersion="4.0" 
     DefaultTargets="Deploy" 
     xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <UsingTask TaskName="TransformXml" 
       AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/> 

    <PropertyGroup> 
     <ProjectPath>C:\Path to Project\Here</ProjectPath> 
     <DeployPath>C:\Path to Deploy\There</DeployPath> 
     <TransformInputFile>$(ProjectPath)\Web.config</TransformInputFile> 
     <TransformFile>$(ProjectPath)\Web.$(Configuration).config</TransformFile> 
     <TransformOutputFile>$(DeployPath)\Web.config</TransformOutputFile> 
     <StackTraceEnabled>False</StackTraceEnabled> 
    </PropertyGroup> 


    <Target Name="Transform"> 
     <TransformXml Source="$(TransformInputFile)" 
         Transform="$(TransformFile)" 
         Destination="$(TransformOutputFile)" 
         Condition="some condition here" 
         StackTrace="$(StackTraceEnabled)" /> 
    </Target> 
</Project> 

He probado lo anterior y puedo confirmar que funciona. Es posible que necesite ajustar la estructura un poco para que se adapte mejor a su script de compilación.

+4

Esto es muy similar a la solución que terminó con. La única advertencia es que la acción TransformXml actualmente tiene un error que no cierra el archivo fuente y, por lo tanto, no puede deshacerse del archivo fuente. Solo algo a considerar; en mi caso, después de hacer la transformación, quería eliminar los archivos Debug.config y Release.config del directorio de implementación. Para evitar esto hasta que MS resuelva el problema. Usted puede simplemente copiar el código fuente y el archivo de transformación en un directorio temporal y luego copiar el archivo recién transformado de nuevo, entonces debería ser capaz de eliminar/eliminar los archivos ... – Jason

+1

Sí, me golpeó ese error, así cuando yo estaba tratando a cabo . Es por eso que tuve que usar $ (ProjectPath) y $ (DeployPath). En realidad, sugeriría utilizar una ubicación intermedia para recopilar todos los artefactos de compilación (que incluirían el archivo Web.config) y luego implementarlos en los diversos servidores web desde esa ubicación que contiene todos los artefactos. Esto evitaría la transformación de Web.config varias veces, suponiendo que todos los servidores web tomarán exactamente el mismo archivo Web.config. –

+2

1 para resolver mi problema de http://stackoverflow.com/questions/2992778/asp-net-web-config-transformation-wont-work-in-installer –

13

Debería poder lograr esto utilizando el objetivo Paquete y especificando el directorio temporal.

msbuild solution.sln /p:Configuration=Release;DeployOnBuild=true;DeployTarget=Package;_PackageTempDir=..\publish 

http://pattersonc.com/blog/index.php/2010/07/15/visual-studio-2010-publish-command-from-msbuild-command-line/

+0

es que este enfoque no se aplicará la configuración transforma a las cadenas de conexión. –

+0

Todas las transformaciones web.config deberían funcionar con este método. ¿Por qué la cadena de conexión no funcionaría específicamente? – pattersonc

+2

Debido a que las cadenas de conexión se manejan de manera diferente y verá un símbolo reemplazable en su lugar: http://troy.hn/gYb7M5 Esto es menos que lo sustituya : http://troy.hn/mk8iJL –

8

Alternativamente, intenta usando la transformación TXD herramienta:

http://ctt.codeplex.com

estoy usando esto en vez de jugar con los objetivos msbuild oscuros. Funciona con app.config no solo web.config.

5

que trabajó para mí con el siguiente cambio

<MSBuild Projects="$(ProjectFile)" 
     Targets="ResolveReferences;_WPPCopyWebApplication" 
    Properties="WebProjectOutputDir=TempOutputFolder;OutDir=$(WebProjectOutputDir);Configuration=$(Configuration);" /> 

De Microsoft.WebApplication.presentar los objetivos en la carpeta MSBUILD

_CopyWebApplication 

This target will copy the build outputs along with the 
content files into a _PublishedWebsites folder. 

This Task is only necessary when $(OutDir) has been redirected 
to a folder other than ~\bin such as is the case with Team Build. 

The original _CopyWebApplication is now a Legacy, you can still use it by 
setting $(UseWPP_CopyWebApplication) to true. 
By default, it now change to use _WPPCopyWebApplication target in 
Microsoft.Web.Publish.targets. 
It allow to leverage the web.config trsnaformation. 
+0

Estoy usando nant, y el objetivo TransformWebConfig no funcionaría bien para mí hasta que también agregue el objetivo _WPPCopyWebApplication. Esto solucionó mi problema. – SouthShoreAK

1

Esta es una excelente valoración crítica acerca de las transformaciones personalizadas:

http://www.diaryofaninja.com/blog/2011/09/14/using-custom-webconfig-transformations-in-msbuild

Necesitábamos personalizar web implementaciones de un poco más de lo normal debido a las toneladas de ASP clásico y otra porquería tuvimos que acomodarnos Este artículo ahorró horas de excavación a través de los objetivos de MS.

+0

Ese artículo hace un excelente trabajo al explicar qué hay de malo en cómo se implementan las transformaciones de configuración. – mhenry1384

Cuestiones relacionadas