0

今月、Rails 3.0 から Rails 3.1 にアップグレードしました - 今週はサーバーを本番モードで起動しようとしました - 今日は壁にぶつかりました!

environment.rb ファイルで設定しない限り、アセット パイプラインを介して本番環境サーバーにパブリック アセット (JavaScript および CSS) を提供させることができconfig.assets.compile = trueません。

多数の JS ファイルと CSS ファイルがあり、それぞれが 1 つまたは 2 つの異なるページで使用される傾向があります。これは、単一の「マニフェスト」ファイルを作成することは、各ページがわずかに異なるものを必要とするため、私の使用法に合わないことを意味します。また、一部の CSS がうまくまとまらないことも予想されます。そのため、大量の CSS / JS を後で整理することを検討して、「機能させるだけ」というアプローチを取りました。

production.rb ファイルは次のとおりです。

Implicit::Application.configure do
  ...

  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true

  # I set this to true, as I am testing this locally, just running a local Thin server
  config.serve_static_assets = true

  config.assets.compress = true

  # Setting this to false removes the issue - but is SLOW
  config.assets.compile = true

  config.assets.digest = true

  # This is overkill - but does get EVERYTHING precompiled for now
  config.assets.precompile += %w( *.css *.js )

  config.action_dispatch.x_sendfile_header = nil
  ...
end

これは私にとってまったく新しい分野なので、今日はこれらのブール値を切り替えたり、ローカルの Thin / Rails サーバーを停止/起動して試したりすることに多くの時間を費やしました。しかし、確実な違いをもたらした唯一の値は、コンパイル フラグです。

私の application.rb ファイルはほぼ標準でありconfig.assets.enabled = trueconfig.assets.initialize_on_precompile = falseその中には、heroku の投稿からの後者が含まれています (これも推測です)。

public/assetsコマンドで作成された完全に入力されたディレクトリがありbundle exec rake assets:precompileます。これは、古いラップトップで実行するのに約20分かかります(5年)。おそらく、その「すべてをキャッチ」プリコンパイル正規表現と関係がありますが、その行にコメントすると、まだ引き継がれます10分(!)

コンパイル フラグを に設定するとtrue、これらのアセットのコピーが自分の/tmp/cacheディレクトリに作成されるのがわかります。これは明らかに、アセットの独自の「コンパイル済みコピー」を作成するアプリケーションです。

コンパイル フラグをfalseに設定すると、jquery.reveal isn't precompiled. ただし、http://localhost:3000/assets/jquery.reveal.jsjavascript ファイルにアクセスすると、サービスが提供されます。

これを引き起こしているアプリケーションレイアウトの行は次のとおりです。

<%= javascript_include_tag "application", "jquery.reveal" %>

その jquery.reveal をjquery.reveal.js変更せずに変更しようとしました。それを削除すると、インデックスページが修正されますが、jquery.reveal 機能はもちろんなくなります。明らかに、application.js は正しく提供されています。public/assets ディレクトリにプリコンパイルされたファイルが表示されるため、jquery.reveal がそうでない理由がわかりません。

4

2 に答える 2

1

これは興味深い問題であり、2つのバグがあると思います。1つはリンクしたもので、もう1つはファイルが間違った名前でコンパイルされているというものです。バグレポートとともに提出できる最小限のテストケースを生成することを試みる価値があるかもしれません。

これの回避策(そしてこれが問題を抱えている人がほとんどいないように見える理由だと思います)は、セカンダリマニフェストを使用することです(マニフェストを介してのみライブラリをリンクすることは、進化するベストプラクティスのようです)。

呼び出されたファイルを作成home.jsし、その1つのファイルだけを要求します。

これは全体的に悪いアプローチではありません。これらの追加のマニフェストはプリコンパイル配列に追加する必要があり(ガイドを参照)、毎回リンクしなくても、複数のライブラリを複数のページまたはセクションで共有できるようにします。

于 2012-01-19T04:09:13.397 に答える
1

ここで自分の質問に答えますが、jquery.reveal などの「ピリオド」を使用してアセットを解析する際のバグのようです

イシュー レポート (https://github.com/rails/rails/issues/3398) はこれを報告し、Sprockets 2.0 の直後に発生するコミット (https://github.com/sstephenson/sprockets/commit/4ba5b32764a9073671df5e77355df6ed2bb3d3c9) を強調しています。 3 - rails 3.1.3 が依存するデフォルトのバージョン。したがって、Sprocket をアップグレードするには、3.2-stable レールに移行する必要があります。

しかし、バグレポートには、これが発生するのは次の場合のみconfig.assets.compile = trueであると書かれています - 私のコードでは、jquery.reveal が動的に jquery-8fu...8g.reveal.js (jquery.reveal- ではなく) にコンパイルされていることがわかりました。 8fu...8g.js)。

したがって、おそらくこれは答えではありません。少なくともそうではないことを願っています。しかし、私が知る限り、CSS / JS ファイルを含む「非期間」は問題なく提供されているため、この期間の問題は引き続き検討します。

于 2012-01-19T03:52:44.810 に答える