3

Heroku にデプロイされた Rails アプリの CSS と JS をパッケージ化するために Jammit を使用しようとしていますが、Heroku の読み取り専用ファイル システムが原因でそのままでは機能しません。これを行う方法について私が見たすべての例では、パッケージ化されたすべてのアセット ファイルを事前にビルドすることを推奨しています。Heroku は Git ベースでデプロイされているため、これらのファイルが変更されるたびにリポジトリに個別にコミットする必要があり、これは私にとって受け入れられる解決策ではありません。代わりに、Jammit がキャッシュされたパッケージを書き込むために使用するパスを変更したいと思います#{Rails.root}/tmp/assets(変更することによりActionController::Base#page_cache_directory)。これは Heroku で書き込み可能です。

私が理解していないのは、キャッシュされたパッケージのデフォルトパスを使用しても、毎回Railsスタックにヒットすることなく、キャッシュされたファイルがどのように使用されるかです。私が何を意味するのか説明しましょう:

Jammit のヘルパーを使用してパッケージを含めると、次のようになります。

<%= include_javascripts :application %>

これにより、次のスクリプト タグが生成されます。

<script src="/assets/application.js" type="text/javascript"></script>

ブラウザがこの URL をリクエストすると、実際には にルーティングされJammit::Controller#package、パッケージのコンテンツがブラウザにレンダリングされ、キャッシュされたコピーが に書き込まれます#{page_cache_directory}/assets/application.js。このキャッシュされたファイルは最初のリクエストで構築され、その後のリクエストは Rails スタックにヒットすることなく、キャッシュされたファイルを直接提供する必要があるという考え方です。Jammit コードを調べましたが、これがどのように発生するのかわかりません。への後続のリクエストが/assets/application.js単純にJammit::Controller再度ルーティングされ、キャッシュされたファイルが使用されないようにするのを妨げるものは何ですか?

私の推測では、ファイルが存在する場合はファイルを提供し、存在しない場合はリクエストをコントローラーに転送する、私が見ていない場所にラックミドルウェアがあると思います。その場合、そのコードはどこにありますか? ActionController::Base#page_cache_directoryまた、変更する場合(Jammit がキャッシュされたパッケージを書き込む場所を効果的に変更する場合)、どのように機能しますか? #{Rails.root}/tmpはパブリック ドキュメント ルートの上にあるため、そのパスにマップされる URL はありません。

4

2 に答える 2

5

素晴らしい質問です!私はこれを自分で設定したわけではありませんが、調べようと思っていたものなので、あなたからそうするように促されました。これが私が試すことです(私はすぐに自分で試してみますが、おそらくあなたは私を打ち負かすでしょう)。

config.action_controller.page_cache_directory = "#{Rails.root}/tmp/page_cache"

config.ru を次のように変更します。

require ::File.expand_path('../config/environment',  __FILE__)
run Rack::URLMap.new(
   "/"       => Your::App.new,
   "/assets" => Rack::Directory.new("tmp/page_cache/assets"))

には何も含まれていないことを確認しpublic/assetsてください。

ノート:

  • これは Rails 3 用です。Rails 2 での解決策は不明です。
  • Rack::DirectoryHeroku がアセットを Varnish にキャッシュするように、キャッシュ コントロール ヘッダーを 12 時間に設定しているようです。Jammit がコントローラーでこれを設定しているかどうかはわかりませんが、設定していなくても、すぐにキャッシュされます。
  • Heroku もENV['TMPDIR']同様に設定されるようになったので、必要に応じて代わりに使用できますRails.root + '/tmp'
于 2011-02-13T06:19:22.907 に答える
0

これは役に立つかもしれません。別の宝石用ですが、アイデアは似ており、プレーンなアセットヘルパーで動作させようとしています。

http://devcenter.heroku.com/articles/using-compass

残念ながら、Rails にアセット ヘルパー モジュール (結合されたスパゲッティに似ています) にパッチを当てたり書き直したりせずにこれを実行させるのは非常に難しいようです。

于 2011-03-04T10:45:19.343 に答える