2010-09-01 10 views
13

Usando msbuild en .NET 4.0, puedo construir un proyecto web con el objetivo "Paquete", y hace un buen trabajo al colocar el paquete en un archivo zip. Pero, cuando miro el web.config allí, no se transforma, tiene "$ (ReplacableToken_Web_SiteConnection-Web.config Connection String_0)"¿Puede MS Deploy hacer un paquete y transformar, pero no implementar?

Puedo ejecutar el objetivo "TransformWebConfig" y hará la transformación correcta , pero solo en su propio silo

También puedo ejecutar el objetivo "Compilar" y pasar las propiedades "DeployOnBuild = True; DeployTarget = MSDeployPublish" y desplegará el paquete en mi servidor con la transformación web.config correcta realizada.

Pero, si quiero implementar manualmente el paquete en el servidor, ¿cómo hago un "Paquete" con un "TransformWebConfig" para que el archivo zip tenga el web.config final allí?

Respuesta

10

La forma en que hacemos esto es modificando la construcción del proyecto para hacer la transformación antes de empaquetarla.

El objetivo TransformXml llamada y es una parte de Microsoft.Web.Publishing.Tasks.dll

En sus propios objetivos de su

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

Pero va a ser incluido en un defecto VS C# acumulación .

Así

<TransformXml Source="web.config" Transform="web.release.config" Destination="$(DeployPath)\web.config" /> 

hace el truco para nosotros.

Configure esas rutas con el ItemGroup correcto ("contenido" más probable) y asegúrese de que el objetivo se active antes de la llamada a Package en su .csproj, y la salida de compilación contendrá un "Web.config" como normal, con los valores transformados correctos.

Alternativamente (hemos utilizado esto para paquetes que deben ser de todo para todos), puede usar ese truco para hacer TODAS las transformaciones e incluir cada una de ellas en el paquete final.

Posteriormente, se llama MSDeploy manualmente y utiliza su salto y reemplazar directivas (olvidó el término técnico) que sólo se emite el correcto despliegue en tiempo

Asumiendo que tiene un web.usethisone.config en el paquete, que parece

-skip:objectname=filepath,absolutepath=web\..*\.config 

-replace:objectName=filepath,match=.*web\.usethisone\.config,replace=web.config 
+0

Gracias, funciona como un encanto y me ahorra mucho tiempo. Pasé mucho tiempo transformando múltiples archivos Web.config para varios entornos de despliegue. –

+0

Estoy luchando con el mismo problema. Agregué al archivo .csproj de mi aplicación web, pero no entendí dónde debería ubicar la sección . ¿Cómo puedo averiguar cuál es el "Grupo de artículos correcto" ("el contenido" más probable) "y cómo" me aseguro de que el objetivo se active antes de la llamada al paquete "en mi archivo .csproj? –

12

Si desea omitir esto, debe establecer una propiedad en su compilación. Puede hacer esto de dos maneras

  1. editar su archivo de proyecto
  2. Crear un archivo de .wpp.targets

recomendaría # 2. Para este caso, cree un nuevo archivo en el mismo directorio que su archivo de proyecto con el nombre {ProjectName} .wpp.targets donde {ProjectName} es el nombre de su proyecto. Luego, dentro de este archivo, debe colocar los siguientes contenidos.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
     ToolsVersion="4.0"> 
    <PropertyGroup> 
    <AutoParameterizationWebConfigConnectionStrings>false</AutoParameterizationWebConfigConnectionStrings> 
    </PropertyGroup> 
</Project> 

En este caso se está ajustando la propiedad AutoParameterizationWebConfigConnectionStrings que cuenta la Publicación en la Web de la tubería a no insertar los marcadores de posición {} en el web.config de las cadenas de conexión.

+0

Eso se refiere a los marcadores de posición pero no explica cómo aplicar las transformaciones al empaquetar. –

Cuestiones relacionadas