Piszę bibliotekę, która ma wbudowaną aplikację Sinatra uruchomioną przez Thora. Chcę zamontować wystąpienia Sprockets::Environment
pod /css
i /js
i ustawić główną aplikację mapowaną na /
. Byłoby to łatwe przy użyciu Rack::URLMap
w pliku config.ru
, ale w tym przypadku nie ma, ponieważ uruchamiam program Sinatra programowo z Sinatra::Application.run!
. Jak mogę to osiągnąć?Jak używać kół zębatych z Sinatrą bez pliku wyścigowego?
Odpowiedz
Skończyło się na tym, pisząc niestandardowe oprogramowanie pośrednie z niektórymi funkcjami z Rack::URLMap
. Wygląda to mniej więcej tak:
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!
Właściwie to nie jest takie trudne. Wszystko, co musisz zrobić, to przypisać instancję Sprockets::Environment
do zmiennej konfiguracji Sinatra i zdefiniować kilka ścieżek zajrzeć do aktywów, które Cię interesują
Oto prosty przykład:.
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
Szczęśliwa sprocketing!
Oto jak zintegrowany z kołem zębatym do Sinatry Szyny podobnego katalogowej układu, pomocników i minifikacji dla JS i CSS.
Wybrałem napisać rozszerzenie Sinatra. To rozszerzenie obejmuje konfigurację kół łańcuchowych (ścieżek, minifikacji, pomocników) i może zostać zarejestrowane przez aplikację.
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
Korzystanie z rozszerzenia w aplikacji jest prosta:
class App < Sinatra::Base
register Sinatra::Assets
# ...
end
Aktywa mogą być umieszczone w assets
lub vendor/assets
. Na przykład vendor/assets/jquery.js
można odwoływać się za pomocą nazwy logicznej, tj. http://localhost/assets/jquery.js
.
W powyższym przykładzie używam sprockets-helpers, który zapewnia pomocników, takich jak javascript_tag
. Konfiguracja podana powyżej zakłada, że w fazie rozwoju chcesz rozszerzyć zasoby wymagane przez zasób referencyjny (co powoduje wiele tagów na zasób).
Dzięki za to - dokładnie to, czego szukałem. – theTRON
Zawsze chętnie pomożemy! –
To, jak wszystkie przykłady z sinatrami, które widziałem, nie działa (lub już nie działa). Czy zmieniło się coś w zębatkach? – Ian