私はこのようにしてみました:
s.add_dependency 'gem', :path => '../gem'
gemfile,
にgemを追加するのと同じですが、機能せず、このエラーが発生します。
/Users/chenqh/.rvm/rubies/Ruby-1.9.3-p194/lib/Ruby/site_Ruby/1.9.1/rubygems/requirement.rb:81:in `parse': Illformed requirement
他のユーザーはgemがローカルに依存しているため、公開後には使用できないため、gemにアクセスできないため、ローカルの依存関係を追加することはおそらく不可能です。その代わりに、独自のプラグインのgemspecにリモート依存関係を追加します。
手順-
1)vendor/plugins/my_plugin /で独自のプラグインのgemspecファイルを開き、キーワードendの前に追加します。
s.add_dependency('will_paginate', '~> 3.0.pre2')
(この例では、will_paginateに必要なmy_pluginの依存関係を使用しました)
2)次に、Railsアプリに移動してGemfileを編集し、以下を追加します。
gem 'my_plugin', path: 'vendor/plugins/my_plugin'
3)Rails app root do:
bundle install
そしてmy_plugin(この場合はwill_paginate)の依存関係がインストールされます。
2つのgem、gem1とgem2を開発しているときに、gem1をローカルでgem2に依存させる必要があるのは非常に便利です。
gemspec
でこれを行うことはできませんが、gemのGemfile
で行うことができます。
# Gemfile
source "https://rubygems.org"
gem 'gem2', :path => '../gem2'
# Specify your gem's dependencies in gem1.gemspec
gemspec
次に、gemspecで、そのgemが既に公開されている場合と同じようにgemを要求します。
# gem1.gemspec
spec.add_runtime_dependency "gem2"
誤ってGemfile
の変更をプッシュしないように注意してください。
場合によっては、ある宝石を別の宝石に埋め込む必要がありますが、その理由は気にしないでください。あるgempecを別のgempecから参照して、ローカルのgemを完全にカプセル化できます。
require "rubygems"
embedded_gemspec = Gem::Specification::load("path/to/internal.gemspec")
Gem::Specification.new do |spec|
spec.name = "gem_that_contains_another_gem"
# spec.whatever, = whole bunch of other info
# our files + other gem's files
spec.files = ['file1.rb', 'file2.rb'] + embedded_gemspec.files
# our dependencies
spec.add_dependency 'nokogiri'
# other gem's dependencies
embedded_gemspec.runtime_dependencies.each { |d| spec.add_dependency d }
end
編集:これはローカルでのみ機能するようです。たとえば、gitリポジトリからこのgemspecをインストールしようとすると、embedded_gemspec
の入手先がわかりません(たとえembedded_gemspec
の依存関係がうまく機能しているとしても)。