Как добавить зависимость локального жемчуга к плагину/движку rails в файле .gemspec

Я пробовал таким образом:

 s.add_dependency 'gem', :path => '../gem'

как добавить gem в gemfile,, но он не работает и вызовет эту ошибку:

/Users/chenqh/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/requirement.rb:81:in `parse': Illformed requirement 

Ответы

Ответ 1

Вероятно, не удастся добавить локальные зависимости, потому что другие пользователи не смогут получить доступ к драгоценному камню, поскольку он зависит от локального и, следовательно, не может использоваться после публикации. Вместо этого добавьте удаленную зависимость в свой собственный плагин gemspec.

Шаги -

1) Откройте файл gemspec вашего собственного плагина в vendor/plugins/my_plugin/ и добавьте перед завершением ключевого слова:

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 выполните:

bundle install

И будет установлена ​​зависимость my_plugin (will_paginate в этом случае).

Ответ 2

При разработке 2-х драгоценных камней gem1 и gem2, требующие, чтобы gem1 локально зависел от gem2, весьма удобен.

Вы не можете сделать это в своем gemspec, однако вы можете сделать это в своем драгоценном камне Gemfile!

# Gemfile
source "https://rubygems.org"

gem 'gem2', :path => '../gem2'

# Specify your gem dependencies in gem1.gemspec
gemspec

И затем в вашем gemspec, требуйте свой драгоценный камень, как обычно, если этот камень был уже опубликован:

# gem1.gemspec
spec.add_runtime_dependency "gem2"

Просто убедитесь, что вы случайно не нажимаете на это изменение Gemfile!

Ответ 3

Иногда вы хотите встроить один камень в другой драгоценный камень, неважно почему. Вы можете ссылаться на один gempec от другого, чтобы полностью инкапсулировать локальный жемчуг.

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 files
  spec.files         = ['file1.rb', 'file2.rb'] + embedded_gemspec.files

  # our dependencies
  spec.add_dependency 'nokogiri'
  # other gem dependencies
  embedded_gemspec.runtime_dependencies.each { |d| spec.add_dependency d }

end

РЕДАКТИРОВАТЬ: это, по-видимому, работает только локально. Если вы попытаетесь установить этот gemspec, скажем, в репозиторий git, он не будет знать, где получить embedded_gemspec (даже если зависимости embedded_gemspec находятся в порядке).