ruby ruby-on-rails-3 windows-7 bundler ubuntu-11.04

ruby - ¿usar ": plataformas=>" en tu trabajo de gemfile?



ruby-on-rails-3 windows-7 (6)

Tengo una aplicación Rails que estoy desarrollando en Windows y estoy implementando en Linux. Sospecho que me cambiaré por completo a Linux en el futuro. De todos modos, en Linux necesito ''execjs'' y ''therubyracer'', pero no los necesito en Win7. Así que puse estas líneas en mi gemfile:

gem ''therubyracer'', :platforms => :ruby gem ''execjs'', :platforms => :ruby

Se ejecutó una bundle install en Linux VM y la aplicación comenzó bien. Pero en Windows obtengo:

Uncaught exception: Could not find execjs-1.2.11 in any of the sources

Ahora, por lo que leo ( aquí en PLATAFORMAS), me dice que "si una gema solo debe usarse en una plataforma o conjunto de plataformas en particular, puede especificarlas" y la muestra es esta:

gem "weakling", :platforms => :jruby

Y dice " ruby C Ruby (MRI) or Rubinius, but NOT Windows ". Entonces, para mí, eso dice que bundler debería estar ignorando la línea de execjs en Windows. Sin embargo, en Windows cuando ejecuté la bundle install vi esto:

Installing execjs (1.2.11)

Entonces eso me dice que me falta algo sobre los documentos o que el paquete está ignorando el comando de plataformas. ¿Estoy haciendo algo mal?

PS>bundle -v Bundler version 1.0.21


gem ''win32-security'', ''~> 0.3.1'' if (RbConfig::CONFIG[''host_os''] =~ /mswin|mingw|cygwin/)

Eso funciona bastante bien para mí.


No estoy seguro sobre el: conmutador de plataforma ya que nunca lo he usado. Sin embargo, una alternativa que creo que funcionará para su escenario sería envolver sus declaraciones para esas dos gemas en un bloque de ''grupo'' en su Gemfile. Como...

group :production do gem ''therubyracer'' gem ''execjs'' end

De esta forma, esas gemas solo se usarán en su entorno de producción, no en desarrollo.

Tenga en cuenta que creo que bundler los instalará en el desarrollo (algo relacionado con la comprobación de dependencias), pero no se cargarán y, por lo tanto, no deberían causar problemas.


Agregue código al Gemfile de esta manera que excluya / incluya gemas dependiendo de la plataforma del sistema operativo

if RUBY_PLATFORM=~ /win32/ gem "windows-only-gem" else gem "os-agnostic-gem" end


:platforms => :ruby hecho excluye la instalación de gemas en Windows.

Sin embargo, no funciona en un entorno cygwin . En cygwin, considera que la plataforma es: mri.

También notará que ruby -e ''puts RUBY_PLATFORM'' salidas i386-cygwin , no i386-mingw32 o i386-mswin como lo haría en Windows ruby.

¿Estabas trabajando en un entorno cygwin?


El concepto de plataforma de RUBY_PLATFORM difiere de la comprensión normal de RUBY_PLATFORM matching o comportamientos de RubyGems.

Puede encontrar toda la documentación sobre cómo usar plataformas para Bundler aquí:

http://bundler.io/v1.14/man/gemfile.5.html

Es posible que no necesite therubyracer en Windows (en realidad no funciona), pero es posible que necesite execjs para que CoffeeScript u otros detalles de Asset Pipeline funcionen correctamente.

En tu caso, haré:

gem "execjs" gem "therubyracer", :platforms => :ruby

ACTUALIZACIÓN: execjs gem podría instalarse porque otra dependencia (no limitada por plataformas) depende de que se instale.


Una variación de la respuesta de @ffoeg funcionó para mí y maneja todos los entornos de Windows, mientras que el solo uso de RUBY_PLATFORM=~ /win32/ no funcionó:

if RUBY_PLATFORM =~ /mswin|mingw|cygwin/i gem ''windows-only'' else gem ''non-windows'' end

Estoy de acuerdo en que no es ideal tener diferentes gemfiles, sin embargo dado que estoy usando unicorn para servir mi blog de Jekyll en Heroku, entonces necesito un gem unicorn , y esto depende de kgio que según varias fuentes es virtualmente imposible de instalar en Windows. ..