ruby-on-rails plugins dependencies rails-engines gemspecs

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 !