2011-01-04 6 views
32

Tengo a ruby gem que tiene dependencias diferentes para cada sistema operativo. Tengo que escribir de forma explícita todos ellos hacia abajo:Rubygems: ¿Cómo agrego la dependencia específica de la plataforma?

En Mac OS X:

gem install livereload 

en Linux:

gem install rb-inotify livereload 

en Windows:

gem install eventmachine-win32 win32-changenotify win32-event livereload 

¿Puedo modificar un gemspec un poco para instalar inst Las subastas se verían como simples gem install livereload para cada sistema operativo?

+0

Parece ser una buena idea comprobar cómo [listen] (https://github.com/guard/listen) gem maneja sus dependencias específicas de plataforma: [rb-inotify] (https://github.com/nex3/rb-inotify) y [rb-fsevent] (https://github.com/thibaudgg/rb-fsevent). – skalee

Respuesta

20

La forma correcta de hacerlo es here. Dado que gemspec se evalúa en el momento del paquete, debe hacerlo en una extensión nativa. No te preocupes, no es tan aterrador ya que es solo el código de Ruby (no compila C ni nada).

Actualmente estamos utilizando este enfoque para algunas herramientas de cliente para OpenShift (source). Luego, en su Gemspec/Rakefile, en lugar de agregar dependencias, debería agregar una extensión. Tenga en cuenta que el archivo debe llamarse ext/mkrf_conf.rb para que esto funcione.

+0

Su fuente de enlace no funciona. Además, ¿no sería posible simplemente agregar todas las gemas como dependencias en Gemspec y requerirlas en base a la plataforma? ('require 'gemname' si RbConfig :: CONFIG ['target_os'] = ~/freebsd/i') – Automatico

+2

@ Cort3z te está faltando un punto importante. La solución que describes funciona, pero resuelve el problema de ** no usar ** la dependencia de gema para cierto sistema operativo después de instalarlo. El problema original es ** no instalar ** la dependencia en absoluto. – i4niac

+0

Aquí está mi ejemplo. Tengo un conjunto de herramientas desarrolladas internamente que combinan un número os shell y scripts de ruby ​​que usamos para iOS, desarrollo de Android y otras tareas. Todo está envuelto en una gema Ruby. Para iOS tenemos dependencias como _xcodeproj_, _cocoapods_, _calabash-cucumber_. Estas gemas no se instalarán en ningún sistema operativo que no sea OSX, simplemente porque necesitan herramientas de línea de comandos de Xcode, simulador de iOS y otras cosas. Pero todavía quiero ser capaz de instalar la gema en Linux para usar scripts de Android. No usaré ninguna herramienta de iOS en Linux, pero también es importante que no estén instalados. – i4niac

Cuestiones relacionadas