0

そこで、Rails3 のアセット パイプラインの調査を開始しましたが、これまでとは少し違うユース ケースが必要なため、レシピを探しています。

  • 私はよく、開発のために webrick をローカルで実行してから、アプリのデプロイされたインスタンスに対して Passenger+Apache を実行します。

  • アプリは http://server/approot/... などの suburi パスで構成されます。

  • Webrick パスをデプロイされたインスタンスのように機能させるmap '/approot' do run appために、config.ru. 現在、webrick は http:// local:3000/approot/... にもあります。

混乱

このセットアップを考えて、私は使用しようとしましrake assets:precompileたが、ローカルと展開の間で多くの構成の問題が発生しました-ファイルの欠落、パスの誤り、firebug の 404 など。

  • config.assets.initialize_on_precompile = falseアセットをプリコンパイルするときに、(いくつかの展開された環境があり、それらを異なる名前で呼んでいます.ug.)application.rbのアプリを初期化しようとするのを防ぎます。production

  • config.assets.precompile += %w( *.js *.css )application.rbjquery.js や ujs、rails.js など、欠落していたものを含めます。

  • config.assets.prefix = "/approot/assets"上記のマップ (config.ru 内) がアセットに適用されない問題を修正するには、アセットを にプリコンパイルする必要がありましたが./public/approot/assets、それがローカルでのみ機能するかどうか、つまりデプロイした場合、アセット パスはhttp:// server/approot/approot/(js|css|...)?_

アセットをプリコンパイルすると、rake タスクは env に切り替わりますがproduction、Rails3 のドキュメントからは、スプロケットが引き続きローカルでオンザフライでコンパイルしてそれらの動的アセットを使用するのか、それとも静的なプリコンパイル済みアセットを代わりに提供するのかは不明です?

  • を入れてみconfig.serve_static_assets = trueましたが、とenvironments/development.rbでどのように機能するかわかりません。assets.debug を false に設定すると、Webrick ログで GET リクエストが非表示になっているように見えますが、「問題を解決した」[sic] という投稿を見ました。config.assets.compress = falseconfig.assets.debug = true

レシピの要件

そこで、次のことを行うレシピが欲しいです。

  • http://server/approot/assets/...パッセンジャーまたは Webrick で実行されている (つまり、デプロイされているかローカルである) かに関係なく、アセットはパスから一貫して正しく提供されます。これが不可能な場合は、ローカルの開発環境を切り替えて、Passenger + Apache も使用できます。大したことではありませんが、可能かどうかを知りたいだけです。

  • 生のアセットは/app/assets通常の Rails3 のように存在しますが、それらをプリコンパイルすると、デプロイされた env でまったく同じように機能するため、アセット ファイルの参照が壊れません/assets/image/...(つまり、現在、パスが明確な場合に探している多くの参照があります)。としてセットアップし/approot/assets/image...ます (Rails3 doc からは、root とサブリへのデプロイについて仮定があるかどうかは不明です (例: http:// server/assets/...vs. http:// server/approot/assets/...)) 。

  • スプロケットはデプロイされた環境では使用できません(申し訳ありませんが、私たちの制限です)。これは、Rails3 アプリが効果的に静的アセット アプリのように見える必要があることを意味します。これがプリコンパイル済みアセットの本来の機能であることはわかっていますが、パスの問題により、宣伝どおりに機能させることができません。


TL;DR - 適切な組み合わせを知っていればうまくいくかもしれない、たくさんの別々のことを試しているような気がします.

参考文献

4

1 に答える 1

0

わかりました、これは潜在的に恐ろしい答えですが、現在2つのコンテキストでWebrickで機能しているようで、ハロウィーンの翌日です(ただし、展開されたスロットでこのアプローチをまだ試していません).

構成

特に明記しない限り、すべてがrails new app世代からのデフォルトです。

config/application.rb

config.assets.initialize_on_precompile = false

environment/production.rb (実際には本番環境ではありません。rake アセット: プリコンパイルにのみ使用されます)

config.assets.css_compressor = :yui
config.assets.js_compressor = :uglifier

environment/stage.rb (これはデプロイされた環境の 1 つです)

config.serve_static_assets = true

config.ru

これは恐ろしい部分です。Rack がサブリとルートの両方を提供するように、マップを複製しました。そのため、レイアウトを表示するコントローラ アクションは を持つことができhttp:// server/approot/foo/index、レイアウト内のアセットは からロードできます。http:// server/assets/...

map '/approot' do
  run AppRoot::Application
end

map '/' do
  run AppRoot::Application
end

ローカルで実行する

$ rake assets:precompile
$ rails s

そしてfirebugでは、スプロケットによって提供される個別のパーツが表示されます(すべて200 OK):

  • GET /アプリルート/
  • GET /assets/application.css?body=1
  • GET /assets/jquery.js?body=1
  • GET /assets/jquery.ujs.js?body=1
  • GET /assets/application.js?body=1

では、「デプロイされた」スロットをローカルでテストして、コンパイルされたアセットが機能するかどうかを確認してください。

$ rails s -e ステージ

そして、正しいプリコンパイル済みアセットが表示されます (すべて 200 OK):

  • GET /アプリルート/
  • /assets/application-xxxxxxxxxxxxxxx.css を取得します。
  • /assets/application-xxxxxxxxxxxxxxx.js を取得します

わかりました、これは実際の suburi ソリューションほど良くはありません。デプロイされたスロットで問題が発生すると思います。ラウンド2、ファイト!

于 2012-11-01T20:11:37.293 に答える