ruby on rails - Cómo agregar la dependencia de una gema local a un plugin/motor de rieles, en el archivo.gemspec
ruby-on-rails plugins (3)
A veces quieres incrustar una gema en otra gema, no importa por qué. Puede hacer referencia a un gempec de otro para encapsular completamente una gema local.
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
EDIT: esto parece funcionar solo localmente. Si intenta instalar esta gemspec desde, por ejemplo, un repositorio de git, no sabrá dónde obtener embedded_gemspec
(aunque las dependencias de embedded_gemspec
están bien).
He intentado de esta manera :
s.add_dependency ''gem'', :path => ''../gem''
como agregar gema en el gemfile,
pero no funciona, y causará este error:
/Users/chenqh/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/requirement.rb:81:in `parse'': Illformed requirement
Es probable que no sea posible agregar dependencias locales porque otros usuarios no podrán acceder a la gema ya que es dependiente local y, por lo tanto, no tiene ningún uso después de la publicación. En lugar de eso, agregue la dependencia remota en su propio gemspec de plugin.
Pasos
1) Abra el archivo gemspec de su propio complemento en vendor / plugins / my_plugin / y agregue antes de que finalice la palabra clave:
s.add_dependency(''will_paginate'', ''~> 3.0.pre2'')
(En este ejemplo, he usado will_paginate la dependencia requerida de my_plugin)
2) Ahora entra en tu aplicación de rieles y edita Gemfile, agrega:
gem ''my_plugin'', path: ''vendor/plugins/my_plugin''
3) Ahora en la raíz de la aplicación rieles hacer:
bundle install
Y la dependencia de my_plugin (will_paginate en este caso) está instalada.
Mientras se desarrollan 2 gemas, gema1 y gema2, es bastante práctico exigir que gema1 dependa localmente de gema2.
¡No puedes hacer esto en tu gemspec
, sin embargo, puedes hacerlo en el Gemfile
tu gema!
# Gemfile
source "https://rubygems.org"
gem ''gem2'', :path => ''../gem2''
# Specify your gem''s dependencies in gem1.gemspec
gemspec
Y luego en tu gemspec, requiere tu gema como lo harías normalmente si esa gema ya se hubiera publicado:
# gem1.gemspec
spec.add_runtime_dependency "gem2"
¡Solo asegúrate de no empujar accidentalmente el cambio de Gemfile
!