宝石をRails 3アプリケーションにフリーズするにはどうすればよいですか?
-
25-09-2019 - |
質問
特定の宝石をRailsアプリケーションに凍結したいです。
Rails 2には、このコマンドがありました。
rake gems:unpack
Rails 3にそのコマンドが見つかりません。
解決
私はまだこれをする必要はありませんでしたが、それはすべてによって処理されていると思います bundler
.
新しいRails3アプリを作成すると、Railsの依存関係が Gemfile
. 。実行できます bundle install
それらをインストールします。デフォルトでは、それらはあなたにインストールされます BUNDLE_PATH
.
アプリ内にそれらをインストールする場合は、次の場所を指定できます。 bundle install vendor/gems
.
他のヒント
だから、短い答えは、あなたはしないということです。
Gemfileを変更してから実行します bundle install
また bundle update
, 、バンドラーはあなたの依存関係解像度を処理し、依存関係チェーン全体を満たす必要がある各宝石の最良の(最新)バージョンを決定します(依存関係リストなどで別の宝石を破る新しいバージョンを取得することはありません。) 。もちろん、特定のバージョン、またはgemfileの '> = 1.2.3'仕様またはwhathaveyouを、馴染みのある構文を使用して配置することもできます config.gem
Days、およびBundlerは、それを確実に満たすようにします(または、有効な解決策がない場合はGemfile.Lockを作成しません)。
Bundlerがビジネスを行うと、Gemfile.Lockファイルを作成します(これは、すべてのワークステーション/環境/展開でGEMを管理するためにバンドラーのみを使用している場合があります)。 。無料で! (このファイルをバージョンコントロールにチェックしてください!)新しい開発インターンが新鮮なマシンでソースを引き下げた場合、それは1つが必要です bundle install
そして、あなたがインストールした宝石のまったく同じバージョンは彼女のマシンにあります。展開にプッシュし、a bundle install --deployment
そこに(または、キャップファイルに投げる可能性が高い)、同じ宝石がインストールされます(今回はベンダー/バンドルに、構成可能)。バンドラーはRails 3ですべての宝石の読み込みを管理するために使用されているので、バンドラーにそれらをインストールするように言ったところはどこでも(あなたの通常は何でも gem install
場所はデフォルトで、または BUNDLE_PATH
(これは.bundle/configで記録されます。 bundle install --path=foo
それ以外の場合)、バンドラーは、システムの宝石とは異なる場合でも、適切なものをロードします。
宝石を開梱してアプリにチェックインする必要はありません。それは重要ではないので、それらがインストールされている場所に関係なく同じバージョンが呼び出されていることを保証します。 (.bundle/ repoにチェックインするべきではありません) - それでは、変更したり使用したりすることのない60〜80 MBのファイルをレポに貼り付けるのはなぜですか? (ちなみに、これが私が推奨しない理由です bundle install --path=vendor/gems
NFMが提案したように - それは必ずしも間違っているわけではありません。通常のバンドラーワークフローに対して利益はありません。今ではレポジットサイズが膨らんだだけです。
NFMによる「推奨」回答を使用しないでください!
代わりに、バンドラーサイト、特に展開に関するページを確認してください。http://gembundler.com/deploying.html
短い要約は、gemfileで特定のバージョンを使用して実行することです bundle install --deployment
正確なGEMバージョンが必要な各ターゲットシステム。
を使用して --path
オプションは宝石をインストールしますが、実際にはやりたいことではありません。 Matt Enrightが言ったように、Bundlerが各ターゲット環境でスマートに処理できるものでSCMを膨らませるだけです。
あなたが実行できないので、私はHerokuでTypusGemの展開のためにこれをしなければなりませんでした heroku rails generate typus
Herokuでは、読み取り専用ファイルシステムです。私はすべての宝石を私のアプリに入れたくありませんでした、ただ私に悲しみを引き起こしていたものだけです。これが成功につながるステップです:
app_name/vendor/gems/gem_name(optional)でディレクトリを作成します...私の場合/app_name/vendor/gems/typus
以下をGemfileに追加します(これは、GEMソースの見つけて配置する場所をBundleに伝えます):
Gem 'Typus'、:git => 'https://github.com/fesplugas/typus.git'、:path => "Vendor/Gems/Typus"
次に、アプリディレクトリ内から(これによりgemをアプリにインストールします):
'gem uppack typus - ターゲットベンダー/宝石/タイパス」
それから
bundle install
次に..私の場合...リポジトリにコミットしてプッシュしてから、Herokuに展開します...あなたは実行する必要があるかもしれません
heroku rake db:migrate
問題なくDreamHostにインストールすることができます。共有されている場合、環境はすでにホームディレクトリにローカルに保存するように設定されています。 VPSまたは専用の場合は、ルートとしてバンドルインストールを実行するか、それを.bash_profileに追加することができます
export GEM_HOME=$HOME/.gems
export GEM_PATH=$GEM_HOME:/usr/lib/ruby/gems/1.8
あなたが探しているのはそうだと思います
bundle package
ここで男性のページをチェックアウトしてください:http://gembundler.com/man/bundle-package.1.html
Tsega(Coreywardによって更新)による答えを2番目に。 「バンドルパッケージ」は一般的な答えです。
ポスターは、彼の宝石を凍らせるかどうか尋ねませんでした。彼は方法を知りたかった。 「Just Do Do Do It」のような答えはまったく役に立ちません。はい、彼の特定の問題はそれとは少し異なっていたことが判明しましたが、「バンドルパッケージ」はやり過ぎだったかもしれませんが、それでも問題を解決します。
私は多くのシステムに取り組んできましたが、一部のシステムでは、フルアクセスができません。一部のシステムにgemsをインストールすることはオプションではありません。したがって、パッケージ化しない限り、一般的にあなたはねじ込まれています。さまざまなホストやシステムにはさまざまな回避策がありますが、一部の人にはありません。
POD-宝石を変更する必要がある場合、これを行うためのベストプラクティスは、プロジェクトを分岐し、変更を加えてから、バンドラーの「git」フラグを使用することです。
git 'some_gem', :git => 'git://github.com/me/my_forked_some_gem.git'
これにより、宝石が更新されたときに通知されます。
あなたが望むコマンドはです bundle package
宝石と依存関係を開梱するだけです vendor/cache
フォルダ。
しかし、ただの通知、 :git => ....
宝石の種類はパッケージ化されません。あなたは道をハッキングする必要があります :git => ...
関連する宝石が詰め込まれます。
のクリーナー指示 gem unpack
と :path =>
オプション:
多くのコメントは、バンドルインストール(パスベンダー/ジェム)を使用することは役に立たないと言っていますが、DreamHostを使用している人は、DreamHostでバンドルインストールを使用できないことに注意してください。
解決策は、すべての宝石をベンダーフォルダーに入れて、すべてをDreamHostディレクトリにアップロードすることです。
これを好転させる他の解決策がありますが、やるのははるかに複雑です。
さて、私は必要な宝石の1つをわずかに変更する必要があります。だから私はそれを私のレポの内側に保つ必要があります。したがって、NFMが言及したのは、おそらく必要なものです。