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).
- 1. szyn, kół zębatych, zamknięcie google i zaawansowanych opts
- 2. Instalacja pliku kół
- 3. jak używać kół hough w cv2 z python?
- 4. Tworzenie numerów sekwencyjnych faktur w SQL Server bez warunku wyścigowego
- 5. Jakiś sukces z Sinatrą współpracującą z EventMachine WebSockets?
- 6. Jak używać SED bez pliku z env var?
- 7. Jak używać spinacza bez pliku, tylko za pomocą sznurka?
- 8. Generowanie pliku css z nowego formatu sass (scss) z sinatrą i hamlem
- 9. Jak wykluczyć * .pyc i __pycache__ z kół Pythona?
- 10. Jak używać FSharpChart z pliku skryptowego fsx
- 11. Jak używać pliku JSON z WEKA
- 12. Jak używać ejs bez ekspresu
- 13. jak używać UITableView bez UITableViewController
- 14. Jak używać tożsamości ASP.NET bez bazy danych
- 15. Jak używać funkcji scanf() bez uwzględniania stdio.h
- 16. jak używać pliku json w pliku maszynopisu
- 17. Jak używać komórek statycznych w UITableView bez korzystania z Scenorysów?
- 18. Jak używać XPath z domyślną przestrzenią nazw bez prefiksu?
- 19. Jak używać IO z Scalaz7 Iteratees bez przepełnienia stosu?
- 20. HoughCircles Nie wykrywa kół prawidłowo w OpenCV
- 21. SDL - rysowanie kół "negatywnych" (Mgła wojny)
- 22. Jak wyłączyć domyślne zachowanie malowania zdarzeń przewijania kół na JScrollPane
- 23. jak używać GPUImage bez skali w Androidzie
- 24. Jak używać vue-loadera bez vue-cli
- 25. Jak używać grup bez przechwytywania w grep?
- 26. Jak używać ng-repeat bez elementu html
- 27. jak używać lodash _ bez operatora z tablicą zamiast wielu argumentów
- 28. Jak używać mysql JOIN bez warunku WŁĄCZENIA?
- 29. Jak używać SymLoadModuleEx do ładowania pliku PDB?
- 30. Jakie są główne różnice między Sinatrą i Ramaze?
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