2011-02-22 16 views
24

No parece posible change the Build Configuration of Visual Studio 2010 Website Projects (a diferencia de las aplicaciones web de Visual Studio), y cambiar la configuración de compilación es una parte clave de habilitar las transformaciones de Web.config (no es posible cambiar la configuración a nada excepto depurar) .¿Cómo hago Transformaciones Web.config con Proyectos de sitio web de Visual Studio?

¿Cómo consigo que las transformaciones de Web.config funcionen con proyectos de sitio web de Visual Studio 2010 si no es posible cambiar la configuración de compilación?

Respuesta

5

me pareció una muy buena entrada en el blog que describe una solución a este aquí: http://andrewtwest.com/2010/02/25/using-web-config-transformations-in-web-site-projects/

En resumen: crear un proyecto vacío (con tal de que no es otro proyecto de sitio web) en la solución que contiene el sitio web. El proyecto vacío le dará acceso a msbuild a través de su archivo de proyecto, lo que le permitirá realizar transformaciones en su sitio web web.config.

+0

Eso es un buen truco, pero dudo que lo implemente ... ¡gracias de cualquier manera! –

+2

Sí, es una lástima que tenga que recurrir a un enfoque tan hacky para integrar msbuild, o incluso usar esa característica de transformación web.config, con proyectos de sitios web. Estoy evitando proyectos de sitios web y voy a utilizar proyectos de aplicaciones web tanto como pueda en el futuro. – porusan

+0

Lo mismo aquí ....... –

7

Preferiría no utilizar toda una solución de proyecto de aplicación web sacada de la caja. Mi solución es utilizar la tarea XmlTransform definida en Microsoft.Web.Publishing.Tasks.dll directamente (esta tarea es el núcleo de WebConfigTransformation) De esta manera es lo suficientemente flexible y hace exactamente lo que espera que haga. Por ejemplo, aquí está el WebSiteTransformator.csproj que estoy usando para transformar web.config.

Aquí también hay un ejemplo de flexibilidad que es imposible de alcanzar con la original WebConfigTransformation: lleva a web.Template.config, aplica web. $ (Configuration) .config sobre él y escribe web.config. Esto nos permite agregar web.config en la lista de ignorar en control de fuente. Todavía es válida csproj ser referenciados por la página web:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 
    <SchemaVersion>2.0</SchemaVersion> 
    <OutputType>Library</OutputType> 
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> 
    <OutputPath>$(TEMP)\TransformWebConfig\bin</OutputPath> 
    <BaseIntermediateOutputPath>$(TEMP)\TransformWebConfig\obj\</BaseIntermediateOutputPath> 
    <IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath> 
    <WebFolderName>$(SolutionDir)\MyWebSite\</WebFolderName> 
    </PropertyGroup> 
    <ItemGroup> 
    <Compile Include="Dummy.cs" /> 
    </ItemGroup> 
    <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/> 
    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 
    <Target Name="BeforeBuild"> 
    <TransformXml Source="$(WebFolderName)Web.Template.config" 
        Transform="$(WebFolderName)Web.$(Configuration).config" 
        Destination="$(WebFolderName)Web.config" /> 
    </Target> 
</Project> 
+0

Necesito probar esto, ¡es muy interesante! Entonces, ¿está diciendo que solo necesito agregar algo similar a las etiquetas UsingTask y TransformXml al proyecto .csproj de mi sitio web? –

+0

Si el proyecto de su sitio web contiene .csproj, supongo que debe tenerlo listo para usar. Este sigue siendo un proyecto externo que se establecerá como dependencia para el sitio web, tipo de evento de nivel de solución del evento BeforeBuild. Y funciona, lo juro :) (En realidad esta es la pieza real de mi base de código actual, solo con MyWebSite en lugar del nombre de la carpeta real). –

+2

Acabo de descubrir una forma mejor de crear eventos de compilación en toda la solución: [MSBuild: Extender la compilación de la solución] (http://sedodream.com/2010/10/22/MSBuildExtendingTheSolutionBuild.aspx) –

2

Como se menciona en el comentario de Andriy anterior, Solution wide build events sin duda parece una forma más limpia de hacer esto.

Estoy agregando esto como una respuesta separada, ya que se pierde un poco en el comentario, pero en mi humilde opinión es la mejor respuesta. Apoyos a Andriy K y Sayed Ibrahim.

1

Si usted prefiere no necesitar un Web.Template.config, he usado esta:

<PropertyGroup> 
    <_tempSourceFile>$([System.IO.Path]::GetTempFileName())</_tempSourceFile> 
    <_tempTransformFile>$([System.IO.Path]::GetTempFileName())</_tempTransformFile> 
</PropertyGroup> 

<Copy SourceFiles="$(ProjectDir)Web.config" DestinationFiles="$(_tempSourceFile)"/> 
<Copy SourceFiles="$(ProjectDir)Web.$(Configuration).config" DestinationFiles="$(_tempTransformFile)"/> 

<TransformXml Source="$(_tempSourceFile)" 
       Transform="$(_tempTransformFile)" 
       Destination="$(ProjectDir)Web.config" 
       StackTrace="false" /> 

Adaptado de una respuesta here.

3

Utilicé un enfoque ligeramente alternativo. Todavía un poco complicado, pero creo que es mucho más sencillo. Esto funcionó para mí, pero obviamente hay muchas configuraciones diferentes disponibles, así que no puedo garantizar que funcione para todos. Esta gira en torno a la forma en que un sitio web se envasa por primera vez en su carpeta AppData antes de ser publicado ...

  1. añadir manualmente un archivo Web.Release.config a la página web y añadir las transformaciones necesarias -, obviamente, no hay 'Añadir Config Transformar la opción para sitios web, por lo tanto, tener que hacer esto manualmente. Ejemplo Web.Release.config:

    <?xml version="1.0" encoding="utf-8"?> 
    <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> 
        <appSettings> 
         <add key="MySetting" value="NewValue" xdt:Transform="Replace" xdt:Locator="Match(key)" /> 
        </appSettings> 
        <system.web> 
         <compilation xdt:Transform="RemoveAttributes(debug)" /> 
        </system.web> 
    </configuration> 
    
  2. Dentro del archivo website.publishproj, asegurarse que la configuración está listo para lanzar:

    <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration> 
    
  3. Añadir lo siguiente a la parte inferior de website.publishproj (justo antes de </Project>):

    <Target Name="AfterBuild"> 
        <MakeDir Directories="$(PackageArchiveRootDir)\..\CSAutoParameterize\original" /> 
        <TransformXml Source="Web.config" Transform="Web.$(ConfigurationName).config" Destination="$(PackageArchiveRootDir)\..\CSAutoParameterize\original\Web.config" StackTrace="false" /> 
    </Target> 
    
+0

Esto funcionó para mí al usar VS 2017 Gracias, @Moo! – HFloyd

Cuestiones relacionadas