web-dev-qa-db-ja.com

ローカルgemの依存関係をRails plugin / engine、.gemspecファイルに追加する方法

私はこのようにしてみました:

 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 
25
QingHua CHEN

他のユーザーは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)の依存関係がインストールされます。

18
My God

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の変更をプッシュしないように注意してください。

45
Ashitaka

場合によっては、ある宝石を別の宝石に埋め込む必要がありますが、その理由は気にしないでください。ある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の依存関係がうまく機能しているとしても)。

2
Ian