Me interesaría saber cómo las personas manejan el marcado condicional, específicamente en sus páginas maestras entre las versiones de lanzamiento y depuración.

El escenario particular al que esto es aplicable es el manejo de archivos js y css concatenados. Actualmente estoy usando el puerto .Net de YUI comprimir para producir un solo site.css y site.js a partir de una gran colección de archivos separados.

Un pensamiento que se me ocurrió fue colocar la sección de inclusión js y css en un control de usuario o una colección de paneles y mostrar condicionalmente el marcado <link> y <script> según el estado de depuración o liberación del ensamblaje. Algo en la línea de:

#if DEBUG
    pnlDebugIncludes.visible = true
#else
    pnlReleaseIncludes.visible = true       
#endif

El panel realmente no es semántico de manera agradable: envolver las etiquetas <script> en <div> es un poco asqueroso; debe haber un mejor enfoque. También pensaría que un elemento de nivel de bloque como <div> dentro de <head> no sería html válido.

Otra idea era que esto podría manejarse usando reemplazos de la sección web.config, pero no estoy seguro de cómo haría eso.

9
Bayard Randel 22 may. 2009 a las 03:25

2 respuestas

La mejor respuesta

Hay una discusión decente sobre los cambios en la configuración de web.config aquí:

Uso de diferentes configuraciones web en entornos de desarrollo y producción.

Nota: está haciendo una pregunta diferente, pero sugiero echarle un vistazo de todos modos porque es una increíble colección de sugerencias sobre cómo cambiar entre la configuración en vivo y de depuración y todas las respuestas (IMO) tienen algún valor, no solo el más votado / respuesta aceptada

Personalmente , uso un método explicado aquí y creo que es el más flexible y aplicable a todos los tipos de cambios de configuración, ya que se basa en archivos, pero permite que se intercambien automáticamente en función de las configuraciones de la solución:

http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx

Esencialmente, ejecuta un evento previo a la compilación para intercambiar la configuración web con otra en el disco con el nombre de configuración de la solución adjunto al nombre del archivo. Por ejemplo, tengo web.config.release, web.config.debug e incluso un web.config.neilathome.

Luego uso exactamente los mismos métodos para bits de código condicionales creando clases parciales y colocando el material que cambia entre las configuraciones de mi solución en sus propios archivos. Por ejemplo, tengo sync_timersettings.cs, que es una clase parcial que contiene algunas constantes que definen con qué frecuencia mi código de actualización llama a un servicio web. O simplemente puede poner todas sus configuraciones en un archivo app.settings y hacerlo de esa manera.

Me parece una solución muy flexible, me permite intercambiar trozos de javascript y css y siempre y cuando se tome el tiempo de poner cosas que cambian entre configuraciones en sus propios archivos, probablemente pueda ir a un estado donde pueda depurar en la configuración de la solución de depuración y luego cambie a liberar e implementar con un solo clic.

Una nota más:

#if DEBUG
    pnlDebugIncludes.visible = true
#else
    pnlReleaseIncludes.visible = true       
#endif

Respuestas a comentarios:

Esto solo es útil si tiene una configuración de solución de depuración y otra que es su implementación en vivo. No funcionará cuando usted (como yo) tenga una configuración de solución provisional, de lanzamiento y de neilonhislaptop ya que el símbolo DEPURAR solo se establece cuando tiene habilitada la depuración. La solución es ir a la página de propiedades de su aplicación web y, en la pestaña de compilación, colocar un símbolo condicional para cada una de sus configuraciones de compilación. IE, establezca su configuración de compilación para liberar y ponga 'liberar' en el cuadro de símbolo condicional en esa pestaña. Luego haga lo mismo para diferentes configuraciones de compilación, el cuadro de símbolo condicional allí cambiará automáticamente dependiendo de su configuración de compilación. # si las directivas de compilación condicional funcionarán como se esperaba entonces.

Bayard solicitó más información sobre cómo usar esto para cambiar el marcado entre configuraciones. Bueno, podría utilizar para intercambiar toda la página .aspx: tener home.aspx.release y home.aspx.debug, pero eso significaría que debe repetir muchas marcas en cada archivo . Mi solución es agregar una clase parcial a mi aplicación. Por ejemplo, mi página 'ViewImage' tiene la siguiente definición de clase:

public partial class ViewImage : System.Web.UI.Page

... así que creé algunos archivos de clase con la misma firma y los llamé 'ViewImage_titleset.cs.debug' y 'ViewImage_titleset.cs.staging':

namespace Website
{
    public partial class ViewImage : System.Web.UI.Page
    {
        public void SetTitle()
        {
            Page.Title = "Running in debug mode";
        }
    }
}

Y

namespace Website
{
    public partial class ViewImage : System.Web.UI.Page
    {
        public void SetTitle()
        {
            Page.Title = "Running in staging mode";
        }
    }
}

.. llamar a SetTitle en el evento de carga de página para ViewImage cambiaría el título dependiendo de qué configuración de compilación se haya implementado. Esto solo funcionará si está alterando la página mediante programación.

Es mejor usar el método de compilación condicional anterior para cambiar código como este y reservar el método de intercambio de archivos para cambiar archivos que no sean de código, como imágenes o web.configs. Solo asegúrese de no configurar los archivos alternativos que se implementarán en la publicación.

5
Community 23 may. 2017 a las 12:06

Acabo de probar esto en mi página maestra en mi proyecto ASP.NET MVC y funcionó. Si en modo DEBUG utilizo la versión de desarrollo de jQuery y si no está en modo DEBUG, utilizo la versión minificada de jQuery:

<head runat="server">
<% #if DEBUG %>
    <script type="text/javascript" src="<%= Url.Content("~/Scripts/jquery.js") %>"></script>
<% #else %>
    <script type="text/javascript" src="<%= Url.Content("~/Scripts/jquery.min.js") %>"></script>
<% #endif %>
</head>
9
Praveen Angyan 21 may. 2009 a las 23:54