rails mac ruby-on-rails ruby rubygems bundler

ruby-on-rails - mac - ruby version



¿Cómo agregar gemas específicas de Mac para empaquetar en Mac pero no en Linux? (5)

@ zed_0xff: encontró un enfoque similar en una rspec-core más rspec-core :

if RUBY_PLATFORM =~ /darwin/ gem ''foo'' end

Estoy desarrollando una aplicación Rails en una Mac, y soy nuevo en las pruebas, así que simplemente agregué estas gemas a mi Gemfile :

group :test, :development do gem ''rspec-rails'' gem ''rb-fsevent'' gem ''growl'' end

Pero mi servidor de producción ejecuta Linux, por lo que incluso si no están agrupados en :production , bundler ( v1.0.21 ) aún intenta instalarlos. ... y falla, obviamente!
extconf.rb:19:in ''<main>'': Only Darwin (Mac OS X) systems are supported (RuntimeError)

Establecer RAILS_ENV en producción antes de ejecutar la bundle install no funciona .

Funcionó ejecutando bundle install --without development test , pero ¿cómo puede ser considerado por el empaquetador estas gemas solo en función de su sistema operativo?

Edición: la wiki de bundler proporciona detalles sobre cómo usar la plataforma como parámetro .
La misma solución se da en el número de paquete 663 , por lo que intenté:

group :test, :development do gem ''rspec-rails'' platforms :darwin do gem ''rb-fsevent'' gem ''growl'' end end

bundle install no funciona, pero incluso si volvemos a la casilla uno y hacemos
bundle install --without darwin , el resultado es ''darwin'' is not a valid platform.
The available options are: [:ruby, :ruby_18, :ruby_19, :mri, :mri_18, :mri_19, :rbx, :jruby, :mswin, :mingw, :mingw_18, :mingw_19]
''darwin'' is not a valid platform.
The available options are: [:ruby, :ruby_18, :ruby_19, :mri, :mri_18, :mri_19, :rbx, :jruby, :mswin, :mingw, :mingw_18, :mingw_19]

¿Algún otro enfoque (elegante)?


De acuerdo con los documentos de Bundler , necesita usar la directiva de platforms :

#Gemfile platforms :mswin do gem "x" end gem "weakling", :platforms => :jruby gem "ruby-debug", :platforms => :mri_18 gem "nokogiri", :platforms => [:mri_18, :jruby]

Hay una serie de plataformas Gemfile:

ruby C Ruby (MRI) o Rubinius, pero NO Windows

ruby_18 ruby AND version 1.8

ruby_19 ruby AND version 1.9

ruby_20 ruby AND version 2.0

Sri Igual que el rubí, pero no Rubinius.

mri_18 mri y la versión 1.8

mri_19 mri y version 1.9

mri_20 mri AND versión 2.0 rbx Igual que ruby, pero solo Rubinius (no MRI

jruby JRuby

mswin Windows

Plataforma ''mingw32'' de Windows mingw (también conocida como RubyInstaller)

mingw_18 mingw Y la versión 1.8

mingw_19 mingw AND versión 1.9 mingw_20 mingw AND versión 2.0


Gemfile en realidad es un archivo regular de ruby, así que puedes usar algo como

case RUBY_PLATFORM when /darwin/ gem ''foo'' when /win32/ gem ''bar'' end


La wiki de Bundler tiene un método que agrega todas las gemas a Gemfile.lock independientemente de la plataforma. Los conjuntos require => false dependiendo del sistema, por lo que no es necesario que puedas ejecutar las gemas:

gem ''rb-inotify'', :require => RUBY_PLATFORM.include?(''linux'') && ''rb-inotify''

Y proporcionan métodos de ayuda para hacer esto limpio:

def os_is(re) RbConfig::CONFIG[''host_os''] =~ re end gem ''rb-fsevent'', "~> 0.9.3", platforms: :ruby, install_if: os_is(/darwin/) gem ''rb-inotify'', "~> 0.8.8", platforms: :ruby, install_if: os_is(/linux/) gem ''wdm'', "~> 0.1.0", platforms: [:mswin, :mingw. :x64_mingw], install_if: os_is(/mingw|mswin/i)

En mi sistema Windows 7 x64 que ejecuta Ubuntu 12.04 en una máquina virtual Vagrant, esto funcionó bien, pero se requirió la configuración de :platforms el empaquetador de Linux se atragantó con la gema ''win32console'':

Console.c:1:21: fatal error: windows.h: No such file or directory


Puede usar el método :install_if que acepta lambda arbitraria.

El siguiente ejemplo viene directamente de las páginas man de Gemfile:

install_if -> { RUBY_PLATFORM =~ /darwin/ } do gem "pasteboard" end

Es mucho mejor que las construcciones de flujo de control (por ejemplo, if ) ya que mantiene las dependencias correctamente y mantiene el Gemfile.lock uniforme en todas las máquinas.