8

私は Rails 3.1 に慣れてきたばかりで、古いプロジェクトを更新し、新しいアセット パイプラインが開発モードと本番モードでどのように動作するかを解明しようとして時間を費やしました。

デフォルトconfig.assets.precompile設定はapplication.cssapplication.jsのみをブレスし、すべてを単一のスタイルシートと単一の JavaScript ファイルとして提供することを意図しています。

明らかに、それが望ましくない状況があるため、その構成変数のリストに項目を追加できます...

本番環境に移行するときにサンドボックス プロジェクトで遭遇した状況は次のとおりです。

  1. 開発中のサイトを閲覧したところ、すべてが機能していることがわかりました。アセットは個別のファイルとしてリンクされ、サイトは正しく表示されました。
  2. サイトをサーバーにアップロードし、本番環境で動作させようとしました。最初のエラーは、「ie.css」 (条件付きスタイルシート) がプリコンパイルされていないというものでした。(私は Safari を使用していましたが、このスタイルシートはダウンロードされませんでしたstylesheet_link_tag。ページをレンダリングする前にヘルパーからエラーが発生しました。)
  3. 実行rake assets:precompileして再試行しました。
  4. 問題のあるアイテムを追加して、config.assets.precompile再試行しました。
  5. 別のアセット エラーに到達するまで、エラーを縁石に蹴り落としました。
  6. 後藤 3.

これに対処する方法がわからなかったので、すべてのアセットを取得し、サイトが本番環境でレンダリングされていると思うまで、何度かぐるぐる回りました。次に、MSIE で試してみたところ、別のエラー 500: "belated_png_fix.js"が条件付きで読み込まれていましたが、それまでは発生しませんでした。

だから私の質問は、試行錯誤や統合テストへの過度の依存以外に、資産パイプラインがスタイルシートまたは JavaScript がプリコンパイル リストに追加されていないことを発見したときに、自分のサイトが爆発しないことをどのように予測できるかということです。 ?

また、スタイルシート アセットが不足している場合に、オンデマンドでコンパイルしたり、アセットが要求されたときに 404 を提供したりするのではなく、ページ全体でエラー 500 が発生する理由にも興味があります。これは「早期に失敗する」ための意図的な設計ですか?

4

4 に答える 4

2

assets_precompile_enforcerという gem をリリースしました。これにより、開発者は開発中にアセットを追加するのを忘れることがなくなりconfig.assets.precompileます。javascript_include_tagまたはを介し​​てアセットを含め、 stylesheet_link_tagconfig.assets.precompile のフィルターと一致しない場合、例外が発生します。

これは、資産エラーが本番環境へのデプロイ後に発見されるのではなく、開発中に発見されることを意味します。

于 2012-12-10T23:57:12.847 に答える
1

継続的な展開は素晴らしいことであり、それが非常に単純で、とにかくそれほど苦痛ではないところまで到達する必要があります。そうは言っても、config.assets.precompile正規表現を取ることができるので、トップレベルのスプロケットの「マニフェスト」ファイルの標準、またはバンドルされないもののための標準のサブフォルダーを考えてみませんか? (実際にはまだ試していないことに注意してください...)

于 2011-09-15T04:54:00.203 に答える
1

Rails 3.1でも同様の問題がありました。あなたができる最善のことは、カピストラーノマルチステージをインストールしてステージングサーバーを取得することです.

何らかの理由でこれが不可能な場合は、コンピュータに仮想マシンをインストールし、サーバー環境を複製してみてください。

于 2011-09-09T19:34:07.057 に答える
0

これはやり過ぎかもしれませんが、これは私にとってはうまくいきます (クリーンでコンパイルされたアセットが得られます)。これは .bash_profile ファイルにあります。

alias ggo='bundle exec rake assets:clean && bundle exec rake assets:precompile && git add . && git commit -m "precompile" && git push origin master && cap deploy'

そして、これは私のconfig/environments/production.rbにあります(必要に応じてプロダクションを強制的にコンパイルします。最初に「ggo」を実行することを覚えている場合は必要ありません):

  config.assets.compile = true

したがって、私のワークフローは次のとおりです。 1. コード 2. git add & git commit 3. CSS/SASS/JS/CoffeeScript ファイルに触れたら、ggo を実行します。それ以外の場合は、通常のキャップ展開を行います。

于 2011-09-15T04:42:06.173 に答える