मैं एक पुस्तकालय लिख रहा हूं जिसमें थोर के माध्यम से एक एम्बेडेड सिनात्रा ऐप लॉन्च किया गया है। मैं Sprockets::Environment
/css
और /js
पर उदाहरणों को माउंट करना चाहता हूं और मुख्य ऐप /
पर मैप किया गया है। यह का उपयोग config.ru
फ़ाइल में आसान होगा, लेकिन इस मामले में ऐसा कोई नहीं है क्योंकि मैं Sinatra::Application.run!
के साथ प्रोग्रामैटिक रूप से सिनात्रा ऐप शुरू कर रहा हूं। इसे कैसे प्राप्त किया जा सकता है?मैं रैंकअप फ़ाइल के बिना सिनात्रा के साथ स्प्राकेट्स का उपयोग कैसे करूं?
उत्तर
मैंने Rack::URLMap
से कुछ कार्यक्षमताओं के साथ एक कस्टम मिडलवेयर लिखकर इसे समाप्त कर दिया। यह इस तरह मोटे तौर पर दिखता है:
require "sprockets"
require "sinatra/base"
class SprocketsMiddleware
attr_reader :app, :prefix, :sprockets
def initialize(app, prefix)
@app = app
@prefix = prefix
@sprockets = Sprockets::Environment.new
yield sprockets if block_given?
end
def call(env)
path_info = env["PATH_INFO"]
if path_info =~ prefix
env["PATH_INFO"].sub!(prefix, "")
sprockets.call(env)
else
app.call(env)
end
ensure
env["PATH_INFO"] = path_info
end
end
class App < Sinatra::Base
use SprocketsMiddleware, %r{/assets} do |env|
env.append_path "assets/css"
env.append_path "assets/js"
end
end
App.run!
दरअसल, यह मुश्किल नहीं है। तुम सब करने की ज़रूरत है एक सिनात्रा विन्यास चर के लिए Sprockets::Environment
का एक उदाहरण आवंटित किया जाता है और संपत्ति में आपकी रुचि है को देखने के लिए कुछ पथ को परिभाषित
यहाँ एक बुनियादी उदाहरण है:।
require "sass"
require "haml"
require "erubis"
require "sinatra"
require "sprockets"
set :assets, Sprockets::Environment.new
# Configure sprockets
settings.assets.append_path "app/javascripts"
settings.assets.append_path "app/stylesheets"
# For compressed JS and CSS output
require "yui/compressor"
settings.assets.js_compressor = YUI::JavaScriptCompressor.new
settings.assets.css_compressor = YUI::CssCompressor.new
get "/" do
haml :index
end
get "/javascripts/:file.js" do
content_type "application/javascript"
settings.assets["#{params[:file]}.js"]
end
get "/stylesheets/:file.css" do
content_type "text/css"
settings.assets["#{params[:file]}.css"]
end
मुबारक sprocketing!
यहाँ कैसे मैं रेल की तरह निर्देशिका लेआउट, सहायकों और जे एस और सीएसएस के लिए minification साथ सिनात्रा में एकीकृत Sprockets है।
मैंने सिनात्रा एक्सटेंशन लिखना चुना। यह एक्सटेंशन स्पॉकेट्स (पथ, न्यूनीकरण, सहायक) की कॉन्फ़िगरेशन को समाहित करता है और एप्लिकेशन द्वारा पंजीकृत किया जा सकता है।
module Sinatra
module Assets
extend Sinatra::Extension
configure do
set :assets, Sprockets::Environment.new(root).tap { |assets|
%w(assets vendor/assets).each do |base|
%w(images javascripts stylesheets).each do |type|
assets.append_path File.join(base, type)
end
end
if production?
assets.js_compressor = Closure::Compiler.new
assets.css_compressor = YUI::CssCompressor.new
uid = Digest::MD5.hexdigest(File.dirname(__FILE__))[0,8]
assets.cache = Sprockets::Cache::FileStore.new("/tmp/sinatra-#{uid}")
else
assets.cache = nil
end
}
end
get "/assets/*" do
env["PATH_INFO"].sub!(%r{^/assets}, "")
expires Time.now + (365*24*60*60) if settings.production?
settings.assets.call(env)
end
helpers do
include Sprockets::Helpers
Sprockets::Helpers.configure do |config|
config.expand = development?
config.digest = production?
end
def assets_environment
settings.assets
end
end
end
end
अपने आवेदन में एक्सटेंशन का उपयोग करना आसान है:
class App < Sinatra::Base
register Sinatra::Assets
# ...
end
आस्तियों assets
, या vendor/assets
में रखा जा सकता है। उदाहरण के लिए vendor/assets/jquery.js
को तार्किक नाम से संदर्भित किया जा सकता है, यानी http://localhost/assets/jquery.js
।
उपर्युक्त उदाहरण में मैं sprockets-helpers का उपयोग कर रहा हूं जो javascript_tag
जैसे सहायक प्रदान करता है। उपर्युक्त कॉन्फ़िगरेशन मानता है कि विकास में, आप संदर्भित संपत्ति द्वारा आवश्यक संपत्तियों का विस्तार करना चाहते हैं (जिसके परिणामस्वरूप प्रति संपत्ति एकाधिक टैग)।
इसके लिए धन्यवाद - बिल्कुल वही जो मैं खोज रहा था। – theTRON
मदद करने के लिए हमेशा खुश! –
यह, मैंने देखा है कि सभी sinatra-sprockets उदाहरणों की तरह, काम नहीं करता (या, अब काम नहीं करता)। क्या स्पॉकेट में कुछ बदल गया है? – Ian