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.