2010-07-22 7 views

Respuesta

88

Este es un error conocido. Esa característica se puede usar ahora solo como parte del proceso de implementación.

https://connect.microsoft.com/VisualStudio/feedback/details/523221/have-web-debug-config-apply-during-development

favor Upvote que, si se encuentra con esto también, por lo que este problema se solucionará lo antes posible.

+16

Para el registro esto no es un error, es por diseño. Estos archivos son para paquete/publicación. Pero eso no debería desanimar a nadie a votar el artículo. –

+0

@Sayed Estoy de acuerdo con usted :) – stacker

+20

Bueno, para mí es un error, de lo contrario, ¿cuál es el propósito de una transformación de depuración/liberación en un servidor local? A veces los diseños son erróneos, eso no significa que sea correcto :) –

34

Esto es bastante simple de hacer y, créalo o no, parece que esta es la forma en que VS está diseñado para funcionar.

Agregue las siguientes líneas textualmente justo antes de la etiqueta de cierre del "Proyecto" del archivo .csproj del proyecto que contiene web.config.

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" /> 
<Target Name="Transform"> 
    <MakeDir Directories="obj\$(Configuration)" Condition="!Exists('obj\$(Configuration)')" /> 
    <TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="obj\$(Configuration)\Web.config" StackTrace="true" /> 
</Target> 

Poner las siguientes líneas textualmente al evento posterior a la generación en las propiedades del proyecto del proyecto que contiene el archivo web.config. Haga esto para cada configuración de compilación para la que desee que se ejecuten las transformaciones.

"$(MSBUILDBINPATH)\msbuild" "$(ProjectPath)" /t:Transform /p:Configuration=$(ConfigurationName);Platform=AnyCPU 
xcopy "$(ProjectDir)obj\$(ConfigurationName)\Web.Config" "$(ProjectDir)". /F /R /Y 
+1

Solo recomendaría agregar comillas dobles alrededor de $ (ProjectDir) y $ (ProjectPath) para evitar errores en caso de que la ruta del proyecto contenga espacios. –

+1

Es mejor usar , como se sugirió en http://stackoverflow.com/a/10506476/52277 –

+0

. Puedo hacer que las transformaciones funcionen con este enfoque, pero no puedo golpear mis puntos de ruptura Tengo la depuración configurada como verdadera, pero nunca alcanzo el punto de interrupción y aparece el siguiente mensaje: "El punto de interrupción no se activará actualmente. No se han cargado símbolos para este documento".Esto solo ocurre para mis configuraciones personalizadas y funciona bien si configuro mi configuración en "Depurar". ¿Algunas ideas? –

0

Sé que esto es viejo, pero estoy enfrentando el mismo problema. Tenemos prueba, transferencia configuraciones vivo que sustituyen a los puntos finales, etc. cadenas de conexión de la opción predeterminada Web.config

Sin embargo, yo haría lo siguiente:

  • Haga clic derecho en la configuración de transformación deseado (por ejemplo Web .Live.config)
  • Haga clic en "Vista previa Transform"
  • Copia de todo, desde la derecha (que es como se ve el Web.config con la transformación)
    • CTRL + A + CTRL + C
  • Abrir el archivo Web.config (por defecto)
  • seleccionar todo (Ctrl + A) y pegarlo en (CTRL + V)
  • Run

No son muchos los pasos y se realiza con bastante rapidez cuando lo dominas. Espero que esto ayude. :)

+0

Si he entendido correctamente, este es un cambio destructivo en el archivo web.config original. En el contexto de la pregunta, estos pasos deberían realizarse cada vez que se inicia una sesión de depuración. –

2

No quería actualizar el archivo web.config en mi proyecto, solo el que termina en la carpeta bin así que así es como lo hice.

Agregue lo siguiente al final de .csproj (justo antes de la etiqueta final del proyecto de cierre)

<Target Name="Transform"> 
    <MakeDir Directories="bin" Condition="!Exists('bin')" /> 
    <TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="bin\$(TargetFileName).config" StackTrace="true" /> 
    </Target> 

Luego se agrega el paso de generación siguiente post

"$(MSBUILDBINPATH)\msbuild" "$(ProjectPath)" /t:Transform /p:Configuration=$(ConfigurationName);Platform=AnyCPU 

Esto significa que cuando se construye una La transformación se lleva a cabo desde la configuración de depuración/liberación al archivo WebsiteName.Config en el directorio de la bandeja de salida, sin interferir con el web.config principal en el proyecto.

+2

Esto transforma la configuración en el directorio bin, desafortunadamente esta configuración nunca se usa. La configuración cargada es realmente la Web.Config en la carpeta del proyecto, no la del directorio bin. – Mick

10

Lo he resuelto de una manera más simple, al agregar esto al final del archivo .csproj, justo antes de la etiqueta. Esto es similar a la respuesta de Keitn, con la diferencia de que no usa un evento de compilación posterior.

<Target Name="BeforeBuild"> 
    <TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" /> 
</Target> 
+1

Confirmado, funciona. Pero tenga cuidado, modifica la copia local de Web.config. Entonces, si está utilizando transformaciones XSLT como RemoveAttributes, definitivamente se elimina. Funciona bien con SetAttributes –

+0

gracias! este trabajo para mi! – panicoper

+0

Esto hizo exactamente lo que estaba buscando. Simple y directo al grano. No estoy seguro de por qué todas las otras soluciones tienen que ser tan ... complejas. –

-1

@ologesa: Sus necesidades de soluciones de acceso de escritura a la Web.config originales (debes de salida en TFS). La mejor solución es generar directamente el Web.config en la carpeta bin como lo hace keitn. Cuando combinamos de keitn y su solución obtenemos la siguiente:

<Target Name="BeforeBuild"> 
    <Message Text="Transforming Web.config from Web.$(Configuration).config" Importance="high" /> 
    <MakeDir Directories="bin" Condition="!Exists('bin')" /> 
    <TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="bin\$(TargetFileName).config" StackTrace="true" /> 
</Target> 
+2

Sería bueno, pero como Mick comentó; este archivo no se usa ¿Cómo consigo que la aplicación o IIS usen este archivo de configuración? – HMR

1

Después de leer muchos mensajes similares y que tienen problemas con los archivos no poder ser sobrescritos o web.config no ser accesible porque es de sólo lectura esto es lo me trabajo para mí:

<Target Name="BeforeBuild" Condition="$(Configuration) == 'MyAltDebugConfiguration'"> 
    <ItemGroup> 
     <OriginalWebConfig Include="$(ProjectDir)Web.config"/> 
     <TempWebConfig Include="$(ProjectDir)TempWeb.config"/> 
    </ItemGroup> 
    <Exec Command="&quot;$(DevEnvDir)tf.exe&quot; checkout &quot;$(ProjectDir)Web.config&quot;" /> 
    <Copy SourceFiles="@(OriginalWebConfig)" DestinationFiles="@(TempWebConfig)" /> 
    <TransformXml Source="$(ProjectDir)TempWeb.config" 
          Transform="Web.$(Configuration).config" 
          Destination="Web.config" /> 
    </Target> 

Notas:

Esto funciona como el objetivo BeforeBuild.

Solo quiero que se ejecute bajo una determinada configuración (un entorno de depuración alternativo) y es por eso que tengo la condición. Al implementar a través de la implementación web, el objetivo de publicación se activa y no necesito que este objetivo se ejecute.

No quiero tener que recordar revisar web.config (solo para deshacerlo cuando haya terminado), así que verifico web.config antes de comenzar la transformación. Si no está utilizando TFS, puede eliminar esta línea.

Debido a VS (2010) \ msbuild no quiere dejar de lado el web.config Fuente utilizo un archivo temporal (gracias a este artículo por la info: http://www.diaryofaninja.com/blog/2011/09/14/using-custom-webconfig-transformations-in-msbuild)

He intentado añadir un comando para elimine TempWeb.config pero VS \ msbuild no quiere soltarlo. Puedo vivir con eso ya que no se agrega a TFS.

Cuestiones relacionadas