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. ..