2009-05-21 24 views
8

Me interesaría saber cómo manejan las personas el marcado condicional, específicamente en sus páginas maestras entre las versiones de depuración y liberación.JS/CSS incluye reemplazo de sección, Depuración frente a versión

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

Una idea que se me ocurrió fue colocar la sección incluir js y css en un control de usuario o colección de paneles y visualizar de forma condicional el marcado <link> y <script> según el estado de depuración o liberación del ensamblaje. Algo a lo largo de las líneas de:

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

El panel no es realmente muy agradable semánticamente - envolver <script> etiquetas en un <div> es un poco bruto; debe haber un mejor enfoque. También creo que un elemento de nivel de bloque como <div> dentro de <head> sería html no 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 iba a hacer eso.

+0

.Net puerto de compresión YUI - Gracias, he estado buscando algo así para concatenar mis propios archivos js. –

+0

OMG - Conozco a ese tipo que hizo ese puerto .NET de YUI. Pequeño mundo, etc. –

Respuesta

5

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

Using different Web.config in development and production environment

Nota: usted está haciendo una pregunta diferente, pero sugiero echarle un vistazo a eso porque es una impresionante colección de sugerencias sobre cómo cambiar entre la configuración en vivo y la depuración y todas las respuestas (IMO) solo la respuesta más votado/aceptado.

Personalmente, utilizo un método que se explica aquí y creo que es el más flexible y es aplicable a todos los tipos de cambios de configuración, ya que se basa archivo, pero permite que sean auto-intercambiado basado en configuraciones de soluciones:

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

en esencia, se ejecuta un evento previo a la acumulación de extraerse del web.config con otro en disco con el nombre de configuración de la solución del nombre de archivo. Por ejemplo, tengo web.config.release, web.config.debug e incluso un web.config.neilathome.

Luego utilizo los mismos métodos exactos para los bits de código condicional creando clases parciales y colocando las cosas que cambian 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 la frecuencia con que mi código de actualización llama a un servicio web. O simplemente podría poner todas sus configuraciones en un archivo app.settings y hacerlo de esa manera.

La considero una solución muy flexible, me permite intercambiar fragmentos de javascript y css y siempre que se tome el tiempo de poner cosas que cambian entre configuraciones en sus propios archivos, probablemente pueda ir a un estado donde puede estar depurando en la configuración de la solución de depuración y luego cambiar a versión e implementar con un solo clic.

Una nota más:

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

Respuestas a los comentarios:

esto sólo es útil si tiene una configuración de la solución de depuración y otro uno que es su despliegue en vivo. No funcionará cuando usted (como yo) tenga una configuración provisional, de lanzamiento y de solución neilonhislaptop, ya que el símbolo DEBUG solo se establece cuando se habilita la depuración. La solución alternativa es ir a la página de propiedades de su aplicación web y en la pestaña de compilación, coloque un símbolo condicional para cada una de las configuraciones de compilación. IE, configura tu configuración de compilación para liberar y coloca 'liberación' 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 margen de beneficio entre las configuraciones. Bueno, usted podría solía cambiar toda la página .aspx - tiene home.aspx.release y home.aspx.debug pero significaría que tenía que repetir una gran cantidad de margen 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 en ella:

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

.so he creado 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"; 
     } 
    } 
} 

..calling SetTitle en el evento de carga de página para ViewImage cambiaría el título en función de la configuración de la construcción estaba en su lugar. Esto solo funcionará si está alterando la página mediante programación.

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

+1

Utilizo también configuraciones de soluciones de desarrollo, prueba y producción. Mientras se define un símbolo de la compilación condicional para cada configuración, debería ser capaz de hacer algo como esto: #if Desarrollo pnlDevelopmentIncludes.visible = true #endif prueba #if pnlTestIncludes.visible = true # endif –

+0

Neil esto ciertamente parece ser el enfoque correcto para tomar.¿Podría ampliar cómo está utilizando las clases parciales para cambiar su marcado entre diferentes compilaciones? –

+0

Es posible que desee cambiar su convención de nomenclatura para que se parezca más a web.debub.config o web.release.config. De manera predeterminada, IIS no publicará archivos que terminen en .config, por lo que puede ser mejor. –

9

Acabo de probar esto en mi página maestra en mi proyecto ASP.NET MVC y funcionó. Si en modo de depuración utilizo la versión de desarrollo de jQuery y si no es en modo de depuración, utilizo la versión miniaturizada 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> 
+0

Parece que no funciona correctamente en el editor (como en el código donde la parte que no está en efecto aparece atenuada) pero funciona. – Will

+1

Tenga en cuenta que el símbolo DEBUG está controlado por la sección ' Sprintstar

1

Con respecto a los archivos JS lo que hago es usar Web Deployment Projects para precompilar la aplicación web. Después de que la compilación se completa si la configuración es Release, minimizo los archivos JS y los reemplazo en el directorio de salida. Todo esto se hace con MSBuild, ya que los proyectos de implementación web son archivos MSBuild.

Cuestiones relacionadas