web-dev-qa-db-fra.com

Le regroupement ne fonctionne pas dans MVC5 lorsque j'active le mode de libération

J'ai le paquet suivant configuré dans BundleConfig.cs:

bundles.Add(new StyleBundle("~/bundles/css").Include(
                      "~/assets/bootstrap/css/bootstrap.css",
                      "~/assets/css/global/all.css"));

et je le référence en utilisant ce qui suit:

@Styles.Render("~/bundles/css")

Lorsque je suis en mode débogage (compilation web.config debug="true"), cela fonctionne comme prévu en ce qu'il restitue les deux fichiers css comme d'habitude, à savoir:

<link href="/assets/bootstrap/css/bootstrap.css" rel="stylesheet"/>
<link href="/assets/css/global/all.css" rel="stylesheet"/>

Cependant, lorsque je définis debug="false", le problème ci-dessus persiste, car il reconnaît les fichiers, mais il les restitue normalement.

Pour confirmer que le groupement peut fonctionner, j'ai activé les optimisations dans BundleConfig, à savoir BundleTable.EnableOptimizations = true;

Chaque fois que je fais ce qui précède, il regroupe le css et apparaît comme prévu, à savoir:

<link href="/bundles/css?v=WBKHkZAJly7jUzHrVDT8SwfaQE-CA9dbOUQUlLKadNE1" rel="stylesheet"/>

MODIFIER:

Quelques personnes ont mentionné que l'ajout du code suivant à mon fichier BundleConfig.cs permettrait d'obtenir ce que je suis après:

#if DEBUG
            BundleTable.EnableOptimizations = false;
#else
            BundleTable.EnableOptimizations = true;
#endif

Je comprends et apprécie cette réponse. Toutefois, selon la documentation, le comportement par défaut du regroupement MVC consiste à regrouper en mode de publication mais pas en mode débogage. Je ne vois pas pourquoi je devrais avoir besoin d'ajouter du code supplémentaire pour le faire faire alors qu'il devrait le faire déjà.

EDIT 2

J'ai une confession à faire. Il se trouve que j'avais le fichier web.config du dossier Views ouvert et non le fichier web.config principal. J'ai changé les paramètres dans le fichier principal web.config et cela fonctionne parfaitement pour moi. Je blâme ReSharper

23
lisburnite

Ceci est le comportement par défaut.

Le regroupement et la minification sont activés ou désactivés en définissant la valeur de l'attribut debug dans l'élément de compilation du fichier Web.config.

http://www.asp.net/mvc/overview/performance/bundling-and-minification

enter image description here

22

Pour contourner ce problème, il faut obliger, dans la variable BundleConfig, à faire exactement ce que je veux. Je ne pense pas que MVC4 avait les mêmes options avec le fichier de configuration (ou que je ne les ai jamais faites fonctionner).

Voici donc ce que j'ai à la fin de ma méthode RegisterBundles:

#if DEBUG
BundleTable.EnableOptimizations = false;
#else
BundleTable.EnableOptimizations = true;
#endif

De cette façon, il y a toujours du monde à voir. Cependant, vous devez vous rappeler de le mentionner lorsque vous démarrez le projet, mais ce n'est pas un problème énorme.

Si vous ne les connaissez pas, le #if DEBUG est un les directives du préprocesseur qui indiquent au CLR de faire ce qu'il y a dans ce bloc lorsque le paramètre de construction DEBUG est présent (ne devrait être présent qu'en mode DEBUG, bien que cela puisse être changé depuis les propriétés du projet). Si cette variable n'est pas présente (mode de validation, ou tout autre mode), alors il fera l'autre bloc.

11
krillgar

La transformation par défaut Release Web.config supprime l'attribut de débogage comme suit:

<compilation xdt:Transform="RemoveAttributes(debug)" />

Toutefois, cela n'entraînera pas le comportement de regroupement attendu. Au lieu de cela, vous devez créer une transformation qui définit littéralement l'attribut debug sur "false", comme suit:

<compilation debug="false" xdt:Transform="SetAttributes" />
4
davrob01

Un autre problème possible est qu’à l’intérieur de votre fichier Global.asax.cs dans la méthode Application_Start(), vous manquez l’appel de votre BundleConfig.

Par exemple, en supposant que votre méthode utilise le nom par défaut RegisterBundles(BundleCollection bundles), puis dans votre fichier Global.asax.cs, vous voudrez ajouter BundleConfig.RegisterBundles(BundleTable.Bundles); dans la méthode Application_Start().

Donc, votre fichier Global.asax.cs pourrait ressembler à ceci:

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);

    }
}
2
Sal Alturaigi

J'ai eu ce problème quand j'ai changé le dossier css. Mon problème était que j'ai changé le fichier BundleConfig pour les fichiers css:

BundleConfig.cs:

bundles.Add(new StyleBundle("~/Content/css").Include(
                      "~/Content/css/bootstrap.css",
   ....

Vues incluses:

@Styles.Render("~/Content/css")

Pour une raison quelconque, cela n'a pas fonctionné. "bundles" semble être un mot clé ou quelque chose (pas sûr). Vous devez le laisser de cette façon:

bundles.Add(new StyleBundle("~/bundles/css").Include(
                      "~/Content/css/bootstrap.css", ...

Vues:

...
@Styles.Render("~/bundles/css")
...

Je n'ai pas besoin de modifier 'BundleTable.EnableOptimizations' ni web.config, ni rien d'autre.

J'espère que ça aide quelqu'un.

0
anrodse

Après avoir lutté pendant plusieurs heures contre ce problème, je vous recommande de l'essayer également:

  1. Ajoutez ceci au tout début de la vue que vous utilisez votre bundle:

    @ { BundleTable.EnableOptimizations = true; }

  2. Réinitialiser IIS

  3. Rechargez votre page et vérifiez si minify fonctionne

Dans mon cas, quelque part dans ma solution, la valeur true de false à BundleTable.EnableOptimizations Quand je force cela à VRAI juste avant que le paquet ne soit utilisé, cela fonctionne.

Après avoir remarqué que cela fonctionne, je l'ai déplacé dans une méthode statique dans ma classe BundleConfig:

public static void EnableOptimizations()
{
    #if DEBUG
        BundleTable.EnableOptimizations = false;
    #else
        BundleTable.EnableOptimizations = true;
    #endif
}

Je peux donc l'appeler depuis la vue et le faire désactiver pour les développeurs

@{
    BundleConfig.EnableOptimizations();
}
0
Rodrigo Peplau