2013-06-06 7 views
16

मैं रेल 3.2.13 और रेल एसेट पाइपलाइन का उपयोग कर रहा हूं। मैं एसेट पाइपलाइन का उपयोग करना चाहता हूं ताकि मैं अपनी संपत्ति के लिए एसएएसएस और कॉफीस्क्रिप्ट और ईआरबी का उपयोग कर सकूं और पाइपलाइन स्वचालित रूप से उन्हें संकलित कर सकूं, इसलिए मैं विकास में पाइपलाइन को बंद नहीं कर सकता। मैं विकास में संपत्तियों को पहले से तैयार नहीं कर रहा हूं और यहां तक ​​कि public/assets/ निर्देशिका भी नहीं है।विकास में स्प्राकेट्स संपत्ति कैशिंग अक्षम करें

हालांकि

, जब मुझे लगता है कि एक layout.html.erb फ़ाइल में शामिल किया जाता है (गाया) इस तरह के एक _partial.html.erb फाइल करने के लिए के रूप में एक शामिल फ़ाइल में परिवर्तन, बनाने के लिए, फ़ाइल को बदलने कर खुद सहित (इस उदाहरण layout.html.erb में), Sprockets नहीं करता है बिना ' परिवर्तन का पता लगाने और कैश को अमान्य करने के लिए, इसलिए मैं एक ही पुरानी फ़ाइल प्राप्त करता रहता हूं। जब मैं इसे सक्रिय विकास में कर रहा हूं, तो मैं संपत्तियों के किसी भी कैशिंग को अक्षम करना चाहता हूं, इसलिए मैं प्रत्येक अनुरोध पर परिवर्तन प्राप्त कर सकता हूं लेकिन मुझे यह नहीं पता कि यह कैसे किया जाए। मैं अपने development.rb में निम्न में से सभी की स्थापना की है:

config.action_controller.perform_caching = false 
config.action_dispatch.rack_cache = nil 
config.middleware.delete Rack::Cache 
config.assets.debug = true 
config.assets.compress = false 
config.cache_classes = false 

फिर भी, यहां तक ​​कि इस के साथ, फ़ाइलों को tmp/cache/assets/ और tmp/cache/sass/ तहत दिखाने के लिए और परिवर्तन भावी अनुरोध पर उपलब्ध नहीं हैं। हर बार जब मैं एक बदलाव देखना चाहता हूं तो मुझे मैन्युअल रूप से उन निर्देशिकाओं को हटाना होगा।

दुर्भाग्य से, एसेट पाइपलाइन के लिए आतंक विरोधी गाइड के How Caching Works अनुभाग की सारी सामग्री है:

Sprockets विकास और उत्पादन में कैश संपत्ति के लिए डिफ़ॉल्ट रेल कैश की दुकान का उपयोग करता है।

TODO: डिफ़ॉल्ट स्टोर को बदलने के बारे में और जोड़ें।

तो, मैं स्प्राकेट्स को मांग पर संपत्तियों को संकलित करने के लिए कैसे प्राप्त कर सकता हूं लेकिन परिणामों को कैश नहीं कर सकता?

उत्तर

26

यहाँ जादू मंत्र है:

config.assets.cache_store = :null_store # Disables the Asset cache 
config.sass.cache = false # Disable the SASS compiler cache 

संपत्ति पाइपलाइन यह एक कैश का खुद का उदाहरण है है और स्थापित करने config.assets.cache = false कुछ नहीं करता है, ताकि आप इसे निष्क्रिय करने के लिए null_store होने के लिए अपने कैश सेट करना होगा।

फिर भी, एसएएसएस कंपाइलर का अपना कैश है, और यदि आपको इसे अक्षम करने की आवश्यकता है, तो आपको इसे अलग से अक्षम करना होगा।

+0

कि पूरी तरह से अजीब है:

समाधान बस ऐसे निर्भरता sprockets जानता है ऐसी है कि कि कैश अवैध जाना चाहिए की घोषणा के द्वारा है। :-) खुशी है कि आपने इसे काम किया है ... –

+0

यह कार्रवाई कैशिंग तर्क का परीक्षण करने की कोशिश करते समय मुझे फ़ाइल स्टोर कैश चालू और बंद करने के लिए बिल्कुल मार रहा था। (वास्तविक कैशिंग भाग के बिना)। धन्यवाद। – CrazyVipa

+0

यह काम नहीं कर रहा है – Benj

1

मैंने निम्नलिखित जिस्ट (https://gist.github.com/metaskills/9028312) बनाया है जो यह करता है और पाया कि यह मेरे लिए काम करने का एकमात्र तरीका है।

# In config/initializers/sprockets.rb 

require 'sprockets' 
require 'sprockets/server' 

Sprockets::Server.class_eval do 

    private 

    def headers_with_rails_env_check(*args) 
    headers_without_rails_env_check(*args).tap do |headers| 
     if Rails.env.development? 
     headers["Cache-Control"] = "no-cache" 
     headers.delete "Last-Modified" 
     headers.delete "ETag" 
     end 
    end 
    end 
    alias_method_chain :headers, :rails_env_check 

end 
+0

कैश समस्या भी यहां समान है, ब्राउज़र कैश रीसेट के साथ काम किया – brauliobo

0

स्वीकार किए जाते हैं जवाब इसे सही ढंग से नहीं कर रहा है और यह पूरी तरह कैश को अक्षम करके विकास में प्रदर्शन खराब हो। अपने मूल प्रश्न का उत्तर देते हुए, आप सीधे संदर्भित नहीं होने पर भी संपत्ति कैश को अमान्य करने के लिए संदर्भित फ़ाइलों में परिवर्तन चाहते हैं।

# layout.html.erb 
<% depend_on Rails.root.join('app').join('views').join('_partial.html.erb') %> 
# replace the above with the correct path, could also be relative but didn't try 
संबंधित मुद्दे