我正在編寫一個通過Thor啓動嵌入式Sinatra應用程序的庫。我想安裝Sprockets::Environment
的實例/css
和/js
,並將主應用映射到/
。在config.ru
文件中使用Rack::URLMap
很容易,但在這種情況下,沒有一個,因爲我使用Sinatra::Application.run!
以編程方式啓動Sinatra應用程序。我怎樣才能做到這一點?如何在沒有機架文件的情況下使用帶Sinatra的鏈輪?
10
A
回答
5
我最終通過編寫自定義的中間件與一些來自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!
13
其實這並不難。所有你需要做的是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!
2
這是我如何集成到鏈輪西納特拉和Rails般的目錄佈局,幫手和縮小的JS和CSS。
我選擇寫一個Sinatra擴展。該擴展封裝了鏈輪的配置(路徑,縮小,助手),並且可以由應用程序註冊。
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
。上面給出的配置假設在開發過程中,您希望擴展參考資產所需的資產(導致每個資產有多個標籤)。
相關問題
- 1. 如何在沒有任何框架的情況下使用帶有Maven的webjar
- 2. 如何在沒有json文件的情況下使用JSON?
- 3. 如何在沒有輪詢的情況下查找文件中的更改?
- 4. 在沒有Xcode的情況下使用帶有Phonegap的Sencha Touch
- 5. 如何在沒有Rails或鏈輪的情況下壓縮資產?
- 6. 在僅使用HTML輸入的情況下在沒有相機API的情況下在iPhone上使用相機
- 7. 如何在沒有包的情況下引用Java文件?
- 8. 如何在沒有框架的情況下使用框架類運行代碼?
- 9. 如何在沒有cpp文件的情況下使用頭文件
- 10. 在沒有命令行的情況下使用帶IntelliJ的SVN
- 11. 如何在沒有setBounds的情況下使用帶有JLayeredPane的JMenuBar?
- 12. 如何在沒有插件的情況下使用fancybox和wordpress?
- 13. 如何在沒有mtl的情況下在攪拌機上導出.OBJ文件?
- 14. 在沒有測試框架的情況下使用Moles
- 15. 在沒有測試框架的情況下使用Selenium 2?
- 16. 如何在沒有Cocoapods的情況下使用帶Swift項目的Sinch SDK
- 17. SDL如何在沒有源文件的情況下工作?
- 18. 如何在沒有dll的情況下訪問配置文件?
- 19. 如何在沒有pdb文件的情況下進行調試?
- 20. 如何在沒有xib文件的情況下集成iAD
- 21. 如何在沒有構建文件的情況下執行Ant
- 22. 如何在沒有.xib文件的情況下添加iads?
- 23. 如何在沒有adb的情況下拉取apk文件?
- 24. 如何在沒有javascript輸入的情況下閱讀文件?
- 25. 如何在沒有文件名的情況下運行javascript
- 26. 如何在沒有visual studio的情況下編譯C文件
- 27. 如何在沒有文件的情況下運行node.js腳本?
- 28. 如何在沒有路徑的情況下運行python文件?
- 29. 如何在沒有Feature.xml文件的情況下卸載功能?
- 30. 如何在沒有tar的情況下netcat多個文件?
感謝你 - 正是我一直在尋找。 – theTRON
總是樂於幫忙! –
這就像我看到的所有sinatra-sprockets示例都不起作用(或者不再有效)。鏈輪中有東西發生了變化嗎? – Ian