web-dev-qa-db-ja.com

リリースモードをオンにすると、MVC5でバンドルが機能しない

BundleConfig.csで次のバンドルを構成しています:

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

そして、私は次を使用してそれを参照します:

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

デバッグモード(web.configコンパイルdebug="true")両方のcssファイルを通常どおりにレンダリングするという点で、期待どおりに機能します。

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

ただし、debug="false"上記の動作は、ファイルを認識するという点で引き続き発生しますが、通常どおりファイルをレンダリングしているだけです。

バンドルが確実に機能することを確認するために、BundleConfigで最適化を有効にしました。つまりBundleTable.EnableOptimizations = true;

上記を行うたびに、CSSがバンドルされ、期待どおりに表示されます。つまり、

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

編集:

BundleConfig.csファイルに次のコードを追加すると、私が望んでいることを達成できるという人が数人います。

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

この応答を理解し、感謝していますが、ドキュメントによると、MVCバンドリングのデフォルトの動作はリリースモードでバンドルすることですが、デバッグモードではバンドルしません。既に実行する必要があるときに、これを実行するために余分なコードを追加する必要がある理由がわかりません。

編集2

告白します。メインのweb.configではなく、Viewsフォルダのweb.configを開いていたことがわかりました。メインのweb.configの設定を変更しましたが、これはうまく機能します。 ReSharperのせいだ

28
lisburnite

これがデフォルトの動作です。

バンドルと縮小は、Web.configファイルのコンパイル要素でdebug属性の値を設定することにより有効または無効になります。

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

enter image description here

27

これを回避する方法は、BundleConfigでそれを強制して、私がやりたいことを正確に行うことです。 MVC4には、構成ファイルと同じオプションがなかったと思います(または、それらを機能させることができませんでした)。

だから、これは私がRegisterBundlesメソッドの最後に持っているものです:

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

このように、常にそこにあり、見やすいです。ただし、プロジェクトを開始するときは忘れずにそこに置く必要がありますが、大したことではありません。

これらに慣れていない場合は、#if DEBUGプリプロセッサディレクティブ です。これは、DEBUGビルドパラメータが存在する場合にそのブロック内の処理をCLRに指示します(プロジェクトプロパティから変更できますが、DEBUGモードでのみ存在する必要があります) 。その変数が存在しない場合(リリースモード、または他のモード)、他のブロックを実行します。

14
krillgar

デフォルトのRelease Web.configトランスフォームは、次のようにデバッグ属性を削除します。

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

ただし、これにより、予期されるバンドリング動作が発生することはありません。代わりに、次のようにデバッグ属性を文字通り「false」に設定する変換を作成する必要があります。

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

別の考えられる問題は、Application_Start()メソッドのGlobal.asax.csファイル内で、BundleConfigへの呼び出しが欠落していることです。

たとえば、メソッドでデフォルト名RegisterBundles(BundleCollection bundles)を使用し、Global.asax.csファイル内で使用する場合、BundleConfig.RegisterBundles(BundleTable.Bundles);メソッドにApplication_Start()を追加します。

したがって、Global.asax.csファイルは次のようになります。

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

    }
}
4
Sal Alturaigi

Cssフォルダーを変更したときにこの問題が発生しました。私の問題は、cssファイルのBundleConfigファイルを変更したことです。

BundleConfig.cs:

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

含まれるビュー:

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

何らかの理由で、これは機能しませんでした。 「バンドル」は、キーワードまたは何か(不明)のようです。このままにしておく必要があります。

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

ビュー:

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

「BundleTable.EnableOptimizations」、web.config、または他の何かを変更する必要はありません。

これが誰かを助けることを願っています。

0

この問題と数時間戦った後、これも試してみることをお勧めします。

  1. バンドルを使用しているビューの最初にこれを追加します。

    @ {BundleTable.EnableOptimizations = true; }

  2. IISをリセットする

  3. ページをリロードして、minifyが機能するかどうかを確認します

私の場合、私のソリューションのどこかで「BundleTable.EnableOptimizations」をtrueからfalseに変更していました。バンドルを使用する直前に強制的にTRUEにすると、これが機能するようになりました。

動作することに気づいた後、それをBundleConfigクラスの静的メソッドに移動しました。

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

したがって、ビューからそれを呼び出して、開発者に対して無効化することができます

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