2013-08-23 6 views
7

nokogiri gem(1.6.0)のインストールに時間がかかるため、本番環境の展開に数分かかる場合があります。これは、gemをインストールするとネイティブ拡張のコンパイルがトリガーされるためです。展開が速くなるように、私は 後続のバンドルインストールでネイティブ拡張再コンパイルをスキップ

bundle package 

DVCS

にそれを私のバンドルをパッケージ化し、チェックした

注意が他に何も変わっていない場合はネイティブ拡張の再コンパイルを回避する方法は、ありますか?

更新:

私は(具体的にはシェフ・ソロ)を展開するOpscodeシェフを使用

環境は次のとおりです。 のUbuntu 12.04LTS 64ビット ルビー193-P448

+0

のために働いていた魔法のコマンドがあります。展開には何を使用していますか? –

+0

@NeilSlater私はシェフを使って展開します。 – Litmus

+0

すべてのネイティブ拡張の回答がありませんが、 'NOKOGIRI_USE_SYSTEM_LIBRARIES = true'を追加しましたか? – zrl3dx

答えて

4

私が見つけましたこれを行う方法。説明は次のとおりです。

Bundlerは、デフォルトで環境変数BUNDLE_PATHが指すフォルダにgemをインストールします。 BUNDLE_PATHのデフォルト値はvendor/bundleです。したがって、すべての宝石は/vendor/bundleフォルダにインストールされます。これはプライベートフォルダ(各バージョンのRailsアプリケーション用)です。新しいバージョンのRailsアプリケーションがインストールされている場合、vendor/bundleは存在しません。したがって、Bundlerは各宝石をインストール/プリコンパイルします。それはrubygems.orgから同じものをダウンロードするよりも節約できるvendor/cacheから宝石を拾いますが、ネイティブ拡張のコンパイルを避けることはできません。

bundle installコマンドラインに渡すことで、これを無効にすることができます。これにより、すべてのバージョン(Railsアプリケーション)からアクセス可能な/shared/pathに常に宝石がインストールされます。

この方法では、すでにインストールされているものが見つかるため、バンドルラーは宝石の再インストール/再コンパイルを試みません。

ので、これは `バンドルinstall`は通常、バンドラーが既に要件に一致findsが宝石をスキップし、私

bundle install --local --deployment --path /shared/bundle --without development test 
+0

ある日、最新の宝石を使用できないアプリが過去にスタックしている可能性があります。それが起こると、貴方の宝石類を売っていないことにひどく後悔するかもしれません。 –

+1

本当ではありません。プロダクションでは、 'Gemfile.lock'でロックされている宝石だけをアプリケーションに使いたいと思っています。 gemのアップグレードは開発中に行われます( 'bundle outdated'と' bundle update'を使用します)。 'bundle package'を使うので、アップグレードされた宝石は' vendor/cache'に保存されます。そして、私が 'bundle install --deployment'を実行すると、新しい宝石は' vendor/cache'からピックアップされ、前述の '--path'オプションで指定されたパスにインストールされます。 – Litmus

+0

これは非常に便利で完全に安全なので、なぜ '--deployment'を使うときにこれがデフォルトの動作でないのだろうと思います! Nokogiriはすべての展開者の最悪の悪夢です。 –

関連する問題