10

Thorを介して起動されたSinatraアプリが組み込まれたライブラリを作成しています。Sprockets::Environmentat/cssとのインスタンスをマウント/jsし、メインアプリをにマップしたいと思います/。これはファイルで簡単に使用できますが、この場合、Sinatraアプリをプログラムで起動しているため、ファイルはありませRack::URLMapん。どうすればこれを達成できますか?config.ruSinatra::Application.run!

4

3 に答える 3

13

実際、これはそれほど難しいことではありません。必要なのは、のインスタンスをSprockets::EnvironmentSinatra構成変数に割り当て、関心のあるアセットを検索するためのパスを定義することだけです。

基本的な例は次のとおりです。

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

ハッピースプロケット!

于 2012-05-20T01:50:05.223 に答える
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!
于 2012-05-21T05:41:44.303 に答える
2

これが、SprocketsをRailsのようなディレクトリレイアウト、ヘルパー、JSとCSSの縮小化を使用してSinatraに統合した方法です。

私は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-helpersjavascript_tagを使用しています。上記の構成は、開発時に、参照されるアセットに必要なアセットを拡張することを前提としています(アセットごとに複数のタグが作成されます)。

于 2013-01-08T09:40:17.600 に答える