c# - net - El paquete no funciona en MVC5 cuando enciendo el modo de liberación
bundles asp net mvc 4 (6)
Después de luchar contra este problema durante varias horas, te recomiendo que pruebes esto también:
Agregue esto al comienzo de la vista que está utilizando su paquete:
@ {BundleTable.EnableOptimizations = true; }
Restablecer IIS
- Recarga tu página y comprueba si minify funciona
En mi caso, en algún lugar de mi solución estaba cambiando "BundleTable.EnableOptimizations" de verdadero a falso. Cuando lo obligo a VERDADERO justo antes de que se use el paquete, funcioné.
Después de que noté que funciona, lo moví a un método estático en mi clase BundleConfig:
public static void EnableOptimizations()
{
#if DEBUG
BundleTable.EnableOptimizations = false;
#else
BundleTable.EnableOptimizations = true;
#endif
}
Así que puedo llamarlo desde la vista y tenerlo minimizado para desarrolladores.
@{
BundleConfig.EnableOptimizations();
}
Tengo el siguiente paquete configurado en BundleConfig.cs:
bundles.Add(new StyleBundle("~/bundles/css").Include(
"~/assets/bootstrap/css/bootstrap.css",
"~/assets/css/global/all.css"));
y lo remito usando lo siguiente:
@Styles.Render("~/bundles/css")
Cuando estoy en el modo de depuración (web.config compilation debug="true"
) funciona como se espera, ya que procesa ambos archivos css de manera normal, es decir:
<link href="/assets/bootstrap/css/bootstrap.css" rel="stylesheet"/>
<link href="/assets/css/global/all.css" rel="stylesheet"/>
Sin embargo, cuando configuro debug="false"
el comportamiento anterior todavía se produce porque reconoce los archivos, sin embargo, simplemente los muestra como normales.
Para confirmar que el empaquetado puede funcionar definitivamente, he habilitado las optimizaciones en BundleConfig, es decir, BundleTable.EnableOptimizations = true;
Cada vez que hago lo anterior, agrupa el css y aparece como se espera, es decir:
<link href="/bundles/css?v=WBKHkZAJly7jUzHrVDT8SwfaQE-CA9dbOUQUlLKadNE1" rel="stylesheet"/>
EDITAR:
Algunas personas han mencionado que agregar el siguiente código a mi archivo BundleConfig.cs logrará lo que busco:
#if DEBUG
BundleTable.EnableOptimizations = false;
#else
BundleTable.EnableOptimizations = true;
#endif
Entiendo y aprecio esta respuesta; sin embargo, de acuerdo con la documentación, el comportamiento predeterminado de la agrupación de MVC es agrupar en modo de lanzamiento pero no en modo de depuración. No veo por qué debería tener que agregar código adicional para que haga esto cuando ya debería estarlo.
Editar 2
Tengo una confesión que hacer. Resulta que tuve el archivo web.config de la carpeta Vistas abierto y no el archivo web.config principal. Cambié la configuración en el web.config principal y esto funciona bien para mí. Culpo a ReSharper
Este es el comportamiento predeterminado.
El agrupamiento y la minificación se habilitan o inhabilitan al establecer el valor del atributo de depuración en el elemento de compilación en el archivo Web.config.
http://www.asp.net/mvc/overview/performance/bundling-and-minification
La forma en que puedo BundleConfig
esto es forzarlo en el BundleConfig
para que haga exactamente lo que quiero que haga. No creo que MVC4 tuviera las mismas opciones con el archivo de configuración (o simplemente nunca las hice funcionar).
Así que esto es lo que tengo al final de mi método RegisterBundles:
#if DEBUG
BundleTable.EnableOptimizations = false;
#else
BundleTable.EnableOptimizations = true;
#endif
De esta manera siempre está ahí, para ver. Sin embargo, debe recordar poner eso allí cuando esté iniciando el proyecto, pero eso no es un gran problema.
Si no está familiarizado con estos, el #if DEBUG
es una directiva de preprocesador que le dice al CLR que haga lo que está en ese bloque cuando el parámetro de compilación DEBUG está presente (solo debería estar presente en el modo DEBUG, aunque eso puede cambiarse las propiedades del proyecto). Si esa variable no está presente (modo Liberar, o cualquier otro modo), entonces hará el otro bloque.
La transformación predeterminada de la versión Web.config elimina el atributo de depuración así:
<compilation xdt:Transform="RemoveAttributes(debug)" />
Sin embargo, esto no hará que se produzca el comportamiento de agrupamiento esperado. En su lugar, debe crear una transformación que literalmente establezca el atributo de depuración en "falso", así:
<compilation debug="false" xdt:Transform="SetAttributes" />
Otro problema posible es que dentro de su archivo Global.asax.cs
en el método Application_Start()
, le falta la llamada a su BundleConfig
.
Por ejemplo, suponiendo que su método usa el nombre predeterminado RegisterBundles(BundleCollection bundles)
luego dentro de su archivo Global.asax.cs
, querrá agregar BundleConfig.RegisterBundles(BundleTable.Bundles);
en el método Application_Start()
.
Por lo tanto, su archivo Global.asax.cs
podría tener este aspecto:
using System;
using System.Collection.Generic;
using System.Linq;
using System.Web;
using System.Http;
using System.Mvc;
using System.Routing;
using System.Optimization;
namespace MyProject
{
public class MvcApplication : System.Web.HttpApplication
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
// ** This line right below might be what you are missing **
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
Tuve este problema cuando cambié la carpeta css. Mi problema fue que cambié el archivo BundleConfig para archivos css:
BundleConfig.cs:
bundles.Add(new StyleBundle("~/Content/css").Include(
"~/Content/css/bootstrap.css",
....
Vistas incluidas:
@Styles.Render("~/Content/css")
Por alguna razón, esto no funcionó. ''paquetes'' parece ser una palabra clave o algo (no estoy seguro). Debes dejarlo de esta manera:
bundles.Add(new StyleBundle("~/bundles/css").Include(
"~/Content/css/bootstrap.css", ...
Puntos de vista:
...
@Styles.Render("~/bundles/css")
...
No tengo necesidad de modificar ''BundleTable.EnableOptimizations'' ni web.config ni ninguna otra cosa.
Espero que esto ayude a alguien.