Bundler .min फ़ाइलों को शामिल नहीं करता है


261

मेरे पास mvc4 बंडल के साथ एक अजीब मुद्दा है जिसमें एक्सटेंशन .min.js के साथ फाइलें शामिल नहीं हैं

अपने बंडलकॉन्फिग क्लास में, मैं घोषणा करता हूं

public static void RegisterBundles(BundleCollection bundles)
{
    bundles.Add(new ScriptBundle("~/Scripts/jquery")
        .Include("~/Scripts/jquery-1.8.0.js")
        .Include("~/Scripts/jquery.tmpl.min.js"));            
}

मेरे विचार से, मैं घोषणा करता हूं

<html>
    <head>
    @Scripts.Render("~/Scripts/jquery")
    </head><body>test</body>
</html>

और जब यह प्रतिपादन करता है, यह केवल प्रतिपादन करता है

<html>
    <head>
         <script src="/Scripts/jquery-1.8.0.js"></script>
    </head>
    <body>test</body>
</html>

अगर मैं jquery.tmpl.min.js को jquery.tmpl.js (और तदनुसार बंडल में पथ को अद्यतन करने के लिए) का नाम बदलूँ, तो दोनों स्क्रिप्ट सही तरीके से प्रस्तुत की गई हैं।

वहाँ कुछ विन्यास सेटिंग है कि यह '.min.js' फ़ाइलों को अनदेखा करने के लिए पैदा कर रहा है?


मैं एमवीसी 4 बंडलर का उपयोग कर रहा हूं और इसमें .min.js फाइलें शामिल हैं।
एरिक जे।

आरटीएम संस्करण या आरसी? यह मेरे लिए RC में भी ठीक काम कर रहा था
Fatal

10
विचार यह है कि डिबग मोड में काम करना, कि बिना मिनिमेशन के "देव" संस्करण का उपयोग किया जाएगा और जब आप गैर-डिबग मोड में होते हैं, तो वह छोटा संस्करण उठाया जाता है। इसे कार्रवाई में देखने के लिए, अपने वेब.config डीबग मान को सही से असत्य में बदलें।
पीटर जर्मिशिस

28
कुछ मामलों में आपके पास स्क्रिप्ट का गैर-छोटा संस्करण नहीं है। मैं संभवतः इसे समझ सकता था अगर दोनों फाइलें मौजूद थीं।
घातक

1
यह एक बम्मर है कि यह डिफ़ॉल्ट रूप से इस तरह काम करता है ... निश्चित रूप से, फ़ाइल पहले से ही खनन की जा सकती है , लेकिन मुझे लगता है कि Microsoft कैश-बस्टिंग उद्देश्यों के लिए बंडलों में पूर्व-निर्मित स्क्रिप्ट जोड़ने का लाभ देखने में विफल रहा (अच्छा छोटा vपैरामीटर हैश) वह url में जुड़ जाता है, और जब फ़ाइल की सामग्री बदल जाती है तो परिवर्तन होता है)
कुछ भी नहीं

जवाबों:


257

मूल रूप से जो समाधान मैंने पोस्ट किया है वह संदिग्ध है (एक गंदा हैक है)। Microsoft.AspNet.Web.Optimization पैकेज में ट्विस्ट किया गया व्यवहार बदल गया है और ट्विस्ट अब काम नहीं करता है, जैसा कि अन्य टिप्पणीकारों ने बताया है। अभी मैं पैकेज के संस्करण 1.1.3 के साथ इस मुद्दे को बिल्कुल भी पुन: पेश नहीं कर सकता।

कृपया जो आप करने जा रहे हैं उसकी बेहतर समझ के लिए कृपया System.Web.Optimization.BundleCollection ( उदाहरण के लिए dotPeek का उपयोग कर सकते हैं ) के स्रोत देखें । मैक्स शिमलेव का जवाब भी पढ़ें ।

मूल उत्तर :

या तो नाम बदलें .min.js से .js या कुछ ऐसा करें

    public static void AddDefaultIgnorePatterns(IgnoreList ignoreList)
    {
        if (ignoreList == null)
            throw new ArgumentNullException("ignoreList");
        ignoreList.Ignore("*.intellisense.js");
        ignoreList.Ignore("*-vsdoc.js");
        ignoreList.Ignore("*.debug.js", OptimizationMode.WhenEnabled);
        //ignoreList.Ignore("*.min.js", OptimizationMode.WhenDisabled);
        ignoreList.Ignore("*.min.css", OptimizationMode.WhenDisabled);
    }

    public static void RegisterBundles(BundleCollection bundles)
    {
        bundles.IgnoreList.Clear();
        AddDefaultIgnorePatterns(bundles.IgnoreList);
        //NOTE: it's bundles.DirectoryFilter in Microsoft.AspNet.Web.Optimization.1.1.3 and not bundles.IgnoreList

        //...your code
     }

4
मेरी ओर से भी धन्यवाद - इसलिए इसे मेरी MVC4 गोटा सूची में जोड़ना :)
दान बी

27
यह लंबे समय से wtf क्षण था, वे कारण या कुछ परिणाम के साथ टिप्पणी की गई उन मिनी फ़ाइलों को जोड़ सकते थे, अब पूरे घंटे बर्बाद सोच रहे थे कि आउटपुट से मेरी स्क्रिप्ट फ़ाइलों को कौन चोरी कर रहा है।
गिदाइरस 13

5
ओपी में फेटल की टिप्पणी के अनुसार, यह समाधान दोनों ही प्रकारों (जैसे jquery) के मौजूद होने पर दोनों के लिए डुप्लिकेट संदर्भों को फिर से तैयार करेगा।
डेनमेसर

11
M $, जब somefile.min.js को स्पष्ट रूप से निर्दिष्ट किया जाता है, या जब केवल .min.js फ़ाइल मौजूद होती है, तो केवल .min.js फ़ाइल शामिल करें! अन्यथा बस वर्तमान व्यवहार को लागू करें!
आदप्तबी

3
अविश्वसनीय है कि वास्तविक वर्ग को "इग्नोरलिस्ट" कहा जाता है, फिर भी यह ऑब्जेक्ट से सीधे निकलता है। कोई LINQ, कोई पुनरावृत्ति नहीं। - msdn.microsoft.com/en-us/library/…
जेपी दस बर्ज

176

Microsoft निम्नलिखित व्यवहार का अर्थ है (और मैं अपनी परियोजनाओं में इसका पालन करना पसंद करता हूं):

लघु संस्करण

  1. आपके पास अपनी फ़ोल्डर में एक स्क्रिप्ट के दोनों डीबग और मिनिफ़ाइड संस्करण एक ही फ़ोल्डर में हैं:
    • script.js
    • script.min.js
  2. आप अपने कोड में केवल script.js को एक बंडल में जोड़ते हैं ।

नतीजतन आप जाएगा स्वचालित रूप से है script.js में शामिल डीबग मोड और script.min.js में रिलीज मोड।

दीर्घ संस्करण

आपके पास .debug.js संस्करण भी हो सकता है । उस स्थिति में फ़ाइल DEBUG में निम्नलिखित प्राथमिकता में शामिल है:

  1. script.debug.js
  2. script.js

कृपया जारी करें:

  1. script.min.js
  2. script.js

ध्यान दें

और वैसे, MVC4 में आपकी स्क्रिप्ट के .min संस्करण होने का एकमात्र कारण ऐसा मामला है जब स्वचालित संस्करण को स्वचालित रूप से संसाधित नहीं किया जा सकता है। उदाहरण के लिए निम्न कोड स्वचालित रूप से बाधित नहीं किया जा सकता है:

if (DEBUG) console.log("Debug message");

अन्य सभी मामलों में आप अपनी स्क्रिप्ट के डिबग संस्करण के साथ जा सकते हैं।


6
अच्छी व्याख्या हालांकि, ओपी की समस्या यह थी कि कुछ स्क्रिप्ट ( jquery.tmpl) नहीं है, के साथ नहीं आया, फ़ाइल का गैर-न्यूनतम संस्करण डाउनलोड नहीं किया। बंडलर स्क्रिप्ट फ़ाइलों को पूरी तरह से अनदेखा कर देता है, अगर इसमें डिबग मोड में एक गैर-न्यूनतम संस्करण नहीं है
Eonasdan

सहमत, अच्छी व्याख्या लेकिन यह सभी ओपी के सवाल का जवाब नहीं देता है।
डिएगो

2
लघु संस्करण मेरे लिए काम नहीं किया। "script.js" इन दोनों रिलीज प्रकारों में शामिल किया जाएगा। मैंने DEBUG / RELEASE को टाल दिया और (जब मैंने स्रोत को देखा) 'script.js' एक चयनित / रेंडर था।
user981375

4
user981375, आपको web.config फ़ाइल में <संकलन डिबग = "झूठा" /> सेट करना होगा
मैक्स शिमलेव

5
मैं इस उत्तर को पसंद करता हूं क्योंकि यह एक "सर्वोत्तम अभ्यास" दृष्टिकोण है और बताता है कि उसी लक्ष्य को प्राप्त करने के लिए बंडलर के डिफ़ॉल्ट नियमों का पालन कैसे किया जा सकता है।
जेम्स रीतेगई

5

यदि आपके पास एक फ़ाइल का एक छोटा संस्करण है, तो मैंने पाया है कि सबसे सरल समाधान की गई फ़ाइल की प्रतिलिपि बनाना है, प्रतिलिपि की गई फ़ाइल के नाम से .min को हटा दें, फिर अपने बंडल में गैर-मिनिफ़ाइड फ़ाइल नाम का संदर्भ लें।

उदाहरण के लिए, मान लीजिए कि आपने एक js घटक खरीदा है और उन्होंने आपको कुछ-लिब-3.2.1.min.js नामक फ़ाइल दी है। एक बंडल में इस फ़ाइल का उपयोग करने के लिए, निम्नलिखित करें:

  1. कुछ lib-3.2.1.min.js कॉपी करें और कॉपी की गई फ़ाइल को कुछ-lib-3.2.1.js नाम दें। अपने प्रोजेक्ट में दोनों फाइलों को शामिल करें।

  2. इस तरह से अपने बंडल में गैर-मिनिफाइ किए गए फ़ाइल को देखें:

    bundles.Add(new ScriptBundle("~/bundles/libraries").Include(
        "~/Scripts/some-lib-{version}.js"
    ));
    

सिर्फ इसलिए कि नाम में 'मिन' के बिना फाइल वास्तव में की जाती है, इसमें कोई समस्या नहीं होनी चाहिए (तथ्य के अलावा यह अनिवार्य रूप से अपठनीय है)। यह केवल डिबग मोड में उपयोग किया जाता है और एक अलग स्क्रिप्ट के रूप में लिखा जाता है। डिबग मोड में नहीं होने पर पूर्व-संकलित न्यूनतम फ़ाइल को आपके बंडल में शामिल किया जाना चाहिए।


4

मुझे एक अच्छा समाधान मिला है जो कम से कम एमवीसी 5 में काम करता है, आप Bundleइसके बजाय बस उपयोग कर सकते हैं ScriptBundle। इसका स्मार्ट व्यवहार नहीं है ScriptBundleकि हम इस मामले में (अनदेखी .min, आदि) को पसंद नहीं करते हैं। अपने समाधान में मैं Bundle.min और .map फ़ाइलों के साथ 3 डी पार्टी लिपियों के ScriptBundleलिए उपयोग करता हूं और मैं अपने कोड के लिए उपयोग करता हूं । मैंने इसे करने की कोई कमियां नहीं देखी हैं। इसे इस तरह से काम करने के लिए आपको मूल फ़ाइल जैसे angular.js को जोड़ना होगा, और यह angular.js को डिबग में लोड करेगा और यह angular.min.js को रिलीज़ मोड में बंडल करेगा।


जब अनुकूलन अक्षम होता है तो यह काम नहीं करता है ( ScriptTable.EnableOptimizations = false)। स्क्रिप्ट पथ जिसमें एक पैटर्न होता है उसका प्रतिपादन नहीं किया जाता है (जैसे ~/Scripts/thirdpartylib/*.js)। यह काम करता है जब EnableOptimizations = true, लेकिन ऐसा करता है ScriptBundle
स्टीवन लाइकेन

मैं इसे झूठ के साथ भी उपयोग करता हूं (विकास के दौरान) और मेरे पास ऐसी समस्याएं नहीं हैं जिनका आप वर्णन करते हैं, इसलिए हो सकता है कि यह आपके लिए इसे प्रभावित करने वाली चीज हो। आपको काम करने के पैटर्न को शामिल करने के बजाय इनडायरेक्ट्री को भी शामिल करना होगा।
इल्या चेर्नोमोर्डिक

क्या आप वाकई अपनी फ़ाइल के ".min.js" संस्करण को प्रस्तुत कर रहे हैं? क्या आप नाम स्थान से System.Web.Optimizationsया नगेट पैकेज से बंडलों का उपयोग कर रहे हैं Microsoft.Web.Optimizations?
स्टीवन लाइकेंस

मैं System.Web.Optimization का उपयोग करता हूँ और मैंने जाँच की कि यह min वर्जन प्रस्तुत करता है, लेकिन मुझे लगा है कि मैं इनडायरेक्ट्री का उपयोग नहीं करता हूँ, लेकिन यह अजीब होगा कि अगर मिन वर्जन के साथ काम नहीं किया गया ... जैसा कि इनडायरेक्टरी नहीं है मेरे लिए पर्याप्त है मैं एक कस्टम स्कैन करता हूं और इसमें शामिल सभी फ़िल्टर को शामिल करता हूं, ताकि हो सकता है कि पैटर्न और इनडायरेक्ट्री वहां ठीक से काम न करें, हालांकि यह थोड़ा अजीब है।
इल्या चेर्नोमोर्डिक

1
नहीं, समस्या दो-गुना है: केवल एक .min.jsफ़ाइल मौजूद है, और *.jsपैटर्न में समाप्त होने वाली फ़ाइलों से मेल नहीं खाता है .min.js
स्टीवन लेकेन्स

3

*.min.jsफ़ाइलों को रेंडर करने के लिए , आपको अक्षम करना होगा BundleTable.EnableOptimizations, जो एक वैश्विक सेटिंग है जो सभी बंडलों पर लागू होती है।

यदि आप केवल विशिष्ट बंडलों के लिए ऑप्टिमाइज़ेशन को सक्षम करना चाहते हैं, तो आप अपना स्वयं का ScriptBundleप्रकार बना सकते हैं जो बंडल में फ़ाइलों की गणना करते समय अस्थायी रूप से अनुकूलन को सक्षम करता है।

public class OptimizedScriptBundle : ScriptBundle
{
    public OptimizedScriptBundle(string virtualPath)
        : base(virtualPath)
    {
    }

    public OptimizedScriptBundle(string virtualPath, string cdnPath)
        : base(virtualPath, cdnPath)
    {
    }

    public override IEnumerable<BundleFile> EnumerateFiles(BundleContext context)
    {
        if (context.EnableOptimizations)
            return base.EnumerateFiles(context);
        try
        {
            context.EnableOptimizations = true;
            return base.EnumerateFiles(context);
        }
        finally
        {
            context.EnableOptimizations = false;
        }
    }
}

उन बंडलों के OptimizedScriptBundleबजाय का उपयोग करें ScriptBundleजिनकी मिनिफ़ाइड फ़ाइल हमेशा उपयोग की जानी चाहिए, भले ही एक गैर-मिनिफ़ाइ किए गए फ़ाइल मौजूद हो।

ASP.NET MVC के लिए Kendo UI के लिए उदाहरण, जो केवल कीमाधारित फ़ाइलों के संग्रह के रूप में वितरित किया गया है।

bundles.Add(new OptimizedScriptBundle("~/bundles/kendo")
        .Include(
            "~/Scripts/kendo/kendo.all.*",
            "~/Scripts/kendo/kendo.aspnetmvc.*",
            "~/Scripts/kendo/cultures/kendo.*",
            "~/Scripts/kendo/messages/kendo.*"));

मुझे एक प्रोडक्शन पब्लिश एक्शन में कुछ मिसिंग स्क्रिप्ट्स आईं, और यह सोचते हुए कि यह एक एमवीसी इश्यू था, मुझे यह जवाब मिला .. लो और निहारना, केडो शामिल है। बहुत लंबे समय तक इसके साथ काम करने के बाद, मैं कुछ भी करने के लिए किंडो से दूर हो जाता हूं
फेलिप

@ फेलिप मैं उसी स्थिति में था जिसके कारण मैंने यह उत्तर लिखा। केन्डो भयानक है। मुझे उम्मीद है कि मेरा उदाहरण सहायक है।
स्टीवन लाइकेन

2

मेरे मामले के लिए, मैं (अद्भुत!) नॉकआउट। जेएस लाइब्रेरी का उपयोग कर रहा था, जो डीबग / नॉन संस्करणों के रूप में आता है:

"~/Scripts/knockout-{Version}.js"
"~/Scripts/knockout-{Version}.Debug.js"

इस काम को करने के लिए, मैंने "नॉकआउट- {संस्करण} .js" (गैर-डीबग) को अपने में शामिल किया और इसे .debug मिला। js फ़ाइल डीबग मोड में।


1

एक आसान तरीका बस उदाहरण के लिए .min फ़ाइल का नाम बदलें। आपके पास abc.min.css है, बस इस फ़ाइल को abc_min.css में बदलने के लिए नाम बदलें और इसे अपने बंडल में जोड़ें। मुझे पता है कि इसे करने का सही तरीका नहीं है, लेकिन सिर्फ एक अस्थायी समाधान है। धन्यवाद और खुश कोडिंग।


1
फ़ाइल को डाउनलोड करने के बाद, आपको फिर से नाम बदलने की जरूरत है।
अनिरुद्ध गुप्ता

मुझे पता है कि इसे करने का सही तरीका नहीं है, लेकिन सिर्फ एक अस्थायी समाधान है
आरके शर्मा

1
इस लाइन को मेरे लिए काम कर रहे हैं // bundTable.EnableOptimifications = true;
अनिरुद्ध गुप्ता

0

बंडलर लाभ के एक बहुत कुछ है इस पेज की जाँच लेकिन :

Microsoft MVC4 प्लेटफ़ॉर्म कंसाइडर्स जो आपके पास प्रत्येक स्क्रिप्ट या स्टाइल बंडल के लिए कम से कम दोनों मिनिमाइज्ड वर्जन और अनमींटेड वर्जन है (डिबग और vsdoc जैसी दूसरी फाइलें भी उपलब्ध हैं)। इसलिए हमें ऐसी स्थितियों में परेशानी होती है कि इनमें से केवल एक ही फाइल है।

आप डिबग स्थिति को वेब में बदल सकते हैं। आउटपुट को संभालने के लिए स्थायी रूप से फाइल में रखें:

<compilation debug="false" targetFramework="4.0" />

आउटपुट में बदलाव देखें! फ़ाइल फ़िल्टरिंग बदल गई। उद्देश्य को पूरा करने के लिए हमें अनदेखा करना होगा केस निस्पंदन जो कि एप्लीकेशन लॉजिक को बदल देगा!


1
डीबग = "गलत" जोड़ना अभी भी मेरे लिए काम नहीं करता है। min.js फाइलें अभी भी शामिल नहीं हैं, हालांकि मैं इग्नोरलिस्ट को भी साफ करता हूं ...
MoSs

-21

दोस्तों जब तक Microsoft इसे एक साथ कार्य करता है मैं बस इसे जारी रखूंगा

इसे इस्तेमाल करे

RegisterBundles में Kendo के लिए यह बंडल बनाते हैं

bundles.Add(new StyleBundle("~/Content/kendo/css").Include(
                    "~/Content/kendo/2012.3.1121/kendo.common.min.css",
                     "~/Content/kendo/2012.3.1121/kendo.dataviz.min.css",
                      "~/Content/kendo/2012.3.1121/kendo.blueopal.min.css"
 ));

_Layout.cshtml में इसे डालें:

@if (HttpContext.Current.IsDebuggingEnabled)
 { 
<link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.common.min.css")"      
rel="stylesheet"  type="text/css" />
<link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.dataviz.min.css")" 
rel="stylesheet" type="text/css" />   
<link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.blueopal.min.css")"    
rel="stylesheet" type="text/css" />
 }
 else
 {
     @Styles.Render("~/Content/kendo/css")   
 }

इस तरह हमें उत्पादन में बंडलों का सबसे अच्छा और डिबग में एक संदर्भ मिलता है

Microsoft अपने MVC 4 कोड को ठीक करने पर इसे ठीक करें


3
मैं इस प्रस्तावित समाधान का प्रशंसक नहीं हूं। अब आप दो स्थानों पर (कम से कम) स्क्रिप्ट के सेट को बनाए रखने के लिए चल रहे हैं
घातक

यह बहुत ज्यादा बंडल के उद्देश्य को हराता है, आपको नहीं लगता?
ओलिवर

4
बंडलिंग पहले से ही इस तरह से काम करता है। यदि आप प्रोजेक्ट को डिबग मोड में चलाते हैं, तो प्रत्येक सीएसएस फ़ाइल व्यक्तिगत रूप से भरी हुई है, हालांकि जब आप रिलीज़ में चलते हैं तो वे संयुक्त होते हैं और एक में छोटा हो जाते हैं। यदि ब्लॉक में कोड डिबग मोड में स्वचालित रूप से पृष्ठ पर दिए गए के समान है।
चाड लेवी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.