2010-06-07 12 views
8

¿Cómo agrego dependencias opcionales a rubygems, ya que no lo admite?Dependencias opcionales de Rubygems

Los casos de uso:

  • que tienen una biblioteca que no sea depende de backports, extlib, facetas o ActiveSupport. En el pasado, simplemente no añadía ninguna de estas dependencias, como las personas podían elegir (léase: jugaría muy bien con lo que sea que estuvieran usando), pero la gente se quejaba mucho de que la biblioteca no funcionaba de la caja, o podían creer Depende de ActiveSupport (que en algunos casos es inútil para algunas personas). Por lo tanto, en este momento depende de Backports, ya que es el más mínimo. Aunque eso significa que las personas instalarán Backports si instalan mi biblioteca, aunque no la utilicen en Runtime.
  • Quiero depender de diferentes gemas dependiendo del entorno (es decir, Johnson en MRI/Rubinius, TheRubyRhino en JRuby, Lyndon en MacRuby).

Un enfoque que pensé sobre es el secuestro extconf.rb. Podría hacer verificaciones del sistema allí. Sin embargo, esto se siente mal. Además, si esta es la única forma, ¿cómo lo hago? ¿Cómo disparo la instalación de gemas adicionales desde allí? system 'gem install ...'?

Respuesta

4

¿Ha intentado dar mensajes informativos de error para las dependencias no satisfechas para aclarar esos conceptos erróneos? Con zombie-chaser, no hago de Gosu una dependencia, pero si las personas intentan usar la versión gráfica sin gosu, les informo que necesitan instalar gosu.

+2

Lo hice, pero a algunas personas simplemente no les importa y grita "error". Además, me gustaría que simplemente funcione. Aunque este es probablemente el camino a seguir (ya que rubygems no es capaz de manejar la situación). –

+0

Me pregunto si rubygems acepta solicitudes de características, o si es "parches bienvenidos" ... –

+0

Creo que esto es bastante difícil de implementar, por ejemplo, la compatibilidad de última hora no es una opción y los metadatos pueden no contener código ejecutable. –

2

sé de un par de gemas que tienen el enfoque de "secuestro extconf.rb":

  • perftools.rb tiene una dependencia si está en 1.9, pero no requiere que la dependencia 1.8.
  • ruby-debug-ide depende de ruby-debug-base en 1.8, ruby-debug-base19 en 1.9.

Ambos usan Gem::DependencyInstaller#install para hacer la instalación, que es probablemente preferible a system 'gem install ...'.

Ver también esta solicitud de función de rubygems: specify dependencies per ruby version.

+1

gracias, de hecho, escribí una pequeña herramienta hace un tiempo para hacer exactamente esto: https://github.com/rkh/gem_tools –

Cuestiones relacionadas