Gemfileでローカル.gemファイルを指定するにはどうすればよいですか?


回答:


282

これは.gem、パッケージのインストールに関する質問への厳密な回答ではありませんが、Gemfileを編集することで、gemごとにあらゆる種類の場所を指定できます。

:path属性を指定すると、そのパスからgemがローカルマシンにインストールされます。

gem "foreman", path: "/Users/pje/my_foreman_fork"

または、:git属性を指定すると、リモートgitリポジトリからgemがインストールされます。

gem "foreman", git: "git://github.com/pje/foreman.git"

# ...or at a specific SHA-1 ref
gem "foreman", git: "git://github.com/pje/foreman.git", ref: "bf648a070c"

# ...or branch
gem "foreman", git: "git://github.com/pje/foreman.git", branch: "jruby"

# ...or tag
gem "foreman", git: "git://github.com/pje/foreman.git", tag: "v0.45.0"

@JHurrahがコメントで述べたように。)


また、一部のファイアウォールではgitプロトコルが問題になる場合があります。そのような場合は試してくださいgem "foreman", :git => "https://github.com/pje/foreman.git"
kode

60

バンドルツールはそのままでは.gemファイルを使用できないようです。:pathに.gemファイルを含むディレクトリを指定しても機能しません。一部の人々は、その目的のためにローカルgemサーバー(geminabox、stickler)をセットアップすることを提案しました。

しかし、私がはるかに簡単であることがわかったのは、ファイルシステムからローカルgem "サーバー"を使用することです。.gemファイルをローカルディレクトリに置き、 "gem generate_index"を使用してGemリポジトリにします。

mkdir repo
mkdir repo/gems
cp *.gem repo/gems
cd repo
gem generate_index

最後に、次の行をGemfileに追加して、バンドラーがこの場所を指すようにします。

source "file://path/to/repo"

リポジトリのgemを更新する場合は、必ずインデックスを再生成してください。


6
ありがとう!また、「file:/// Absolute / Path / to / repo」を実行するには、3番目のスラッシュが必要でした
Anna

5
コマンドラインで "gem server"を実行し、ソース " localhost:8808 "をGemfileに追加する方が簡単ではないでしょうか
Anna

これは本当にクールなマーティンです!共有していただきありがとうございgem serverます。実行に依存したくなかったため、プロジェクト全体をホストしたくなかったので、まさに探していました。.gemファイルのみです。
Leo Gallucci

6
おまけのヒント:このようにFile.expand_pathを使用すると、絶対パスの要件を回避できますsource "file://#{File.expand_path('.')}/chef-11.10.0.dev.2"
Leo Gallucci

うまくいきません。Mac OS X. Bundler v1.11.2:Could not fetch specs from file://Users/nakilon/....../
Nakilon '10

43

私はあなたの宝石をアプリケーションベンダーフォルダーに解凍します

gem unpack your.gem --target /path_to_app/vendor/gems/

次に、Gemfileにパスを追加して、解凍したgemをリンクします。

gem 'your', '2.0.1', :path => 'vendor/gems/your'

29

デフォルトでは、Bundlerは最初にシステムをチェックし、gemが見つからない場合はGemfileで指定されたソースを使用します。


そうだね。以前にインストールしていない場合はどうなりますか(サーバーにデプロイするとき)どのソースコマンドでもImlib2-Ruby-0.5.2が見つかりませんでした
ddayan

184
gem "gemname"、:path => "〜/ some / local / path"でローカルディレクトリを指すことができます
JHurrah

5
:pathには、gemspecファイルを含むgemフォルダーが必要だと思います。インストールしたい.gemファイルしかない。
ddayan

1
キャップデプロイは成功しましたが、gemはインストールされていませんでした。「そのようなファイルをロードする必要はありません-vips」:/
ddayan

4
それは、少なくとももはや間違いなく真実ではありません。バンドラーはないではない、あなたのシステムの宝石を見て、そして唯一のGemfileに何で行きます。それがとてもひどい理由の一つ。
bioneuralnet

6

"bundle package"と "bundle install --local"を使用してデプロイしたgemをbundlerに強制させることができます

開発マシンで:

bundle install

(必要なgemをインストールし、Gemfile.lockを作成します)

bundle package

(gemをベンダー/キャッシュにキャッシュします)

サーバー上:

bundle install --local

(--localは「ベンダー/キャッシュからの宝石を使用する」を意味します)


サーバーに何もインストールできない場合はどうなりますか?この場合、rakeでビルドする必要がありますが、サーバーにはビルドに使用するgemがありません。しかし、依存関係のチェックに問題はありません。
Henrik

「インストールBUNDLE」宝石は私の既存のGemfile「ソースに含まれていなかったなら、私のために仕事はしませんでした。
アンナ・

実行する前に、gemファイルを一時的にgemファイルから削除するだけです。bundle installその後、gemfileをvendor / cacheにコピーし、gemをgemfileに追加して実行します bundle install --local
bert bruynooghe

1
bundle package今でも、3年後の素晴らしい提案です。バンドラーのバージョンが(まだこの書き込みではリリースされません)2.0より古い場合は、使用する必要がありますbundle package --allあなたが持つ宝石含めたい場合pathgit依存関係を。ただし、このような依存関係が検出された場合は、参考になるでしょう。
L2G 2014年

1
参考:デプロイするプラットフォームとは異なるプラットフォームで開発する場合(たとえば、macOSで開発する、Linuxにデプロイする場合)、期待どおりに機能しない可能性があります。あたりとして--localのドキュメント:「適切なプラットフォーム固有の宝石がrubygems.org上に存在する場合は、それが見つからないということ。」
Liam Dawson、

1

に追加.gemするvendor/cacheとうまくいくようです。では、オプションは必要ありませんGemfile


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.