¿Cómo puedo usar Web.debug.config en el servidor depurador de Visual Studio incorporado?

Respuestas:

92

Este es un error conocido. Esa función se puede utilizar ahora solo como parte del proceso de implementación.

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

Por favor, vote a favor, si encuentra esto también, para que se solucione lo antes posible.

apilador
fuente
16
Para el registro, esto no es un error, es por diseño. Estos archivos son para empaquetar / publicar. Pero eso no debería disuadir a nadie de votar el tema.
Sayed Ibrahim Hashimi
26
Bueno, para mí es un error, de lo contrario, ¿cuál es el propósito de una transformación Debug / Release en un servidor local? A veces los diseños son erróneos, eso no significa que sea correcto :)
Lord of Scripts
4
El problema surge cuando usas Github y necesitas ignorar web.config al sincronizar. Pero eso frustra el propósito de tener una copia de seguridad, quiero decir, es por eso que uso Github. Ahora agregue AppHarbor al escenario y debe admitir dos tipos de archivos web.config, porque desea que sus apikeys se publiquen en Github, por lo que debe sustituir valores en sus configuraciones antes de sincronizar y publicar. Es un problema. Olvídese de sustituir sus valores en la configuración y sincronizar por error, ¿y adivina qué? Tus apikeys se acaban de convertir en un repositorio público. Vaya, qué problema.
David Robbins
8
El enlace a MS Connect está roto
Michael Freidgeim
17
@LordofScripts: cuando se cierra un error "según lo diseñado", a veces quiero decir "¡entonces hay un error en su diseño!"
Roy Tinker
34

En realidad, esto es bastante simple de hacer y, lo crea o no, parece que esta es la forma en que VS está diseñado para funcionar.

Agregue las siguientes líneas literalmente antes de la etiqueta de cierre "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>

Coloque las siguientes líneas textualmente en el evento posterior a la compilación en las propiedades 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
atascado
fuente
1
Solo recomendaría agregar comillas dobles alrededor de $ (ProjectDir) y $ (ProjectPath) para evitar errores en caso de que la ruta de su proyecto contenga espacios.
Alexander Prokofyev
1
Es mejor usar <Target Name = "BeforeBuild">, como se sugirió en stackoverflow.com/a/10506476/52277
Michael Freidgeim
Puedo hacer que las transformaciones funcionen con este enfoque, pero no puedo alcanzar mis puntos de interrupción. He configurado la depuración en verdadero, pero nunca llegué al punto de interrupción y aparece el siguiente mensaje "El punto de interrupción no se alcanzará actualmente. No se han cargado símbolos para este documento". Esto solo ocurre con mis configuraciones personalizadas y funciona bien si configuro mi configuración en "Depurar". ¿Algunas ideas?
mithun_daa
1
Tuve que agregar comillas dobles alrededor de $ (MSBUILDBINPATH) para que funcione; de ​​lo contrario, sale con el código 9009
sotn
6
Tenga en cuenta que esto reemplaza al original Web.config , por lo que todas sus transformaciones deben ser "idempotentes" (se pueden volver a aplicar sobre los resultados de cualquiera de las otras transformaciones). También le impedirá mantener la cordura si pone el archivo en control de código fuente (como probablemente debería hacerlo). En general, un truco "simple" que traslada la complejidad / el dolor al siguiente conjunto de problemas. Bueno si puedes abordarlo "mejor" allí, malo si no lo haces. También considere usar $ (VisualStudioVersion) en lugar de codificar la versión VS ( se olvidará de cambiarla).
TNE
16

Lo había resuelto de una manera más simple, agregando 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 posterior a la compilación.

<Target Name="BeforeBuild">
    <TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
</Target>
Marius Ologesa
fuente
3
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
Loul G.
Esto hizo exactamente lo que estaba buscando. Simple y directo al grano. No estoy seguro de por qué todas las demás soluciones tienen que ser tan ... complejas.
David Carrigan
¿Alguien sabe cómo deshacer esta acción en la sección <Target name = "AfterBuild">?
Cameron Belt
1
Esta debería ser la respuesta.
Cameron Belt
2

No quería actualizar 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 agregue el siguiente paso de compilación posterior

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

Esto significa que cuando construyes una transformación se lleva a cabo desde la configuración de depuración / liberación al archivo WebsiteName.Config en el directorio bin de salida, por lo que no interfiere con el web.config principal del proyecto.

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

Después de leer muchas publicaciones similares y tener problemas con archivos que no se pueden sobrescribir o que web.config no es accesible porque es de solo lectura, esto es lo que obtuve trabajando 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 se ejecuta como el destino BeforeBuild.

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

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

Debido a que VS (2010) \ msbuild no quiere soltar la fuente web.config, uso un archivo temporal (gracias a este artículo por la información: http://www.diaryofaninja.com/blog/2011/09/ 14 / utilizar-transformaciones-webconfig-personalizadas-en-msbuild )

Intenté agregar un comando para eliminar el TempWeb.config pero VS \ msbuild no quiere soltarlo. Puedo vivir con él ya que no se agrega a TFS.

Mike Cheel
fuente
Tengo este error The command ""C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\tf.exe" checkout "C:\_Code\RTS\SCTimeSheet\Web.config"" exited with code 9009. ¿Algunas ideas?
sky91
1

Sé que esto es antiguo, pero estoy enfrentando el mismo problema. Tenemos configuraciones de prueba, puesta en escena, en vivo que reemplazan los puntos finales, cadenas de conexión, etc. del Web.config predeterminado

Sin embargo, haría lo siguiente:

  • Haga clic derecho en la configuración de transformación deseada (por ejemplo, Web.Live.config )
  • Haga clic en "Vista previa de la transformación"
  • Copie todo desde la derecha (así es como se ve Web.config con la transformación)
    • CTRL + A + CTRL + C
  • Abra el archivo Web.config (predeterminado)
  • Seleccionar todo (CTRL + A) y pegarlo (CTRL + V)
  • correr

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

Gaui
fuente
Si lo he entendido correctamente, este es un cambio destructivo en el archivo web.config original. En el contexto de la pregunta, estos pasos deben realizarse cada vez que se inicia una sesión de depuración.
Red Taz
-1

@ologesa: Su solución necesita acceso de escritura al Web.config original (debe realizar el check-out en TFS). La mejor solución es generar directamente Web.config en la carpeta bin, como hace keitn. Cuando combinamos keitn's y su solución, obtenemos esta:

<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>
Mickey Mouse
fuente
3
Sería bueno, pero como comentó Mick; este archivo no se utiliza. ¿Cómo hago para que la aplicación o IIS use este archivo de configuración?
HMR