Rails 2.Xでは、gemsをvendor/gems/gem_name
にコピーするか、rakeコマンドrake gems:unpack
を使用できます。Rails3はbundlerを使用するため、動作しないようです。コマンドbundle package
を見つけましたが、同じようには機能しません。
したがって、これについて少し詳しく説明します。
Rails 2が機能した方法で、簡単にgrepでvendor/gems
の内容を見つけることができました。それらが.gem
ファイルにバンドルされている場合、また、gem/pluginを開発するときは、コンテキスト内でテストするためにRailsアプリケーション内に配置することが非常に役立ちます。そのようなことをbundlerで行うには/ Rails3?ワークフローは本質的に何らかの形で壊れていますか?
質問の2番目の部分に答え、プラグイン/ gemを開発し、gemを公開せずにRailsアプリで出荷します。これを行うことができます。
Gemfile
gem 'my_private_gem', :path => "vendor/gems/my_private_gem-VERSION"
gem unpack my_private_gem --target vendor/gems
注:バンドルパッケージすべてのgemをアンパックします(Gemfile.lockにあるものと同じ数)。 gitには入れたくないでしょう。
Bundlerに相当するisbundle package
。 Gemfileで指定されたすべての.gemファイルをvendor/cache
にパッケージ化して、今後のインストールで http://rubygems.org/ ではなくこのキャッシュからgemを取得できるようにします
正しいBundlerの同等物はbundle install --deployment
です。これにより、gemsが展開された状態でvendor/bundle
にインストールされます。
これは私のために働いたものです:
gem unpack <GEM_NAME> [-v <VERSION>] --target vendor/gems
gem specification <GEM_NAME> [-v <VERSION>] --Ruby > vendor/gems/<GEM_NAME>[-<VERSION>].gemspec
例えば:
gem unpack sidekiq-pro -v 2.1.4 --target vendor/gems
gem specification sidekiq-pro -v 2.1.4 --Ruby > vendor/gems/sidekiq-pro-2.1.4.gemspec
最初のコマンドは、gemをvendor/gemsディレクトリに解凍します。ただし、これにはgemspecが含まれていません。 2番目のコマンドは、関連するgemspecを作成します。別のポスターが似たようなことを述べたことは注目に値します。このソリューションは、gemspecをyamlではなくRuby形式で正しく書き込みます。
次に、Gemfileを更新して、ベンダー提供のgemを指すようにします。
gem '<GEM_NAME>', '<VERSION>', :path => "vendor/gems/<GEM_NAME>-<VERSION>"
例えば:
gem 'sidekiq-pro', '2.1.4', :path => "vendor/gems/sidekiq-pro-2.1.4"
hosted_gem_development gemによって提供される「ホストされた」開発インフラストラクチャの使用を検討してください。
Gemの開発は、使用するアプリケーションに関して個別のプロジェクトのように振る舞うため、多くの場合トリッキーです。
「ホストされた」開発インフラストラクチャは、ライブアプリケーションにそれらを「ホストする」ように含めることにより、gem開発を容易にします。次に、通常のアプリケーションコードを更新するように、gemのコードを更新します。