2011-12-07 16 views
12

Tengo una aplicación Rails que desarrollo 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. Por lo que poner estas líneas en mi Gemfile:usa ": plataformas =>" en su trabajo de gemfile?

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

pasó una bundle install en la máquina virtual de Linux y la aplicación empecé a subir bien. Pero en Windows me sale:

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

Ahora, por lo que leí (here bajo plataformas) me dice que "Si una joya sólo se debe utilizar en una plataforma en particular o un conjunto de plataformas, puede especificar ellos" y la muestra es la siguiente:

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 execjs en Windows. Sin embargo en Windows cuando me encontré bundle install vi esto:

Installing execjs (1.2.11) 

Así que me dice que me falta algo acerca de los documentos o bundler ignora el comando plataformas. ¿Estoy haciendo algo mal?

PS>bundle -v 
Bundler version 1.0.21 
+0

El bit de información que se necesita es que las plataformas en el Gemfile se refiere a la implementación de Ruby, NO OS. Rubí ==: resonancia magnética en todas las plataformas de sistemas operativos por lo que no se puede utilizar para evitar que una joya de ser instalado en un sistema operativo u otro. – ffoeg

+1

@ffoeg la línea de los documentos (rubí: C Rubí ... NO Windows) no está de acuerdo con que – jcollum

+0

mi error. La respuesta a tu pregunta sigue siendo la misma. las plataformas en Bundler funcionan, pero no es el mecanismo que desea utilizar en este caso. Ver mi respuesta a continuación. – ffoeg

Respuesta

18

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

Sin embargo, no lo hace trabajo en un entorno decygwin. En cygwin, considera que la plataforma es: mri.

también se dará cuenta de que ruby -e 'puts RUBY_PLATFORM' salidas i386-cygwin, no i386-mingw32 o i386-mswin como lo haría en Windows rubí.

Estaba trabajando en un entorno cygwin?

+0

Para un _linux_ o _darwin_ env usando los requisitos, como se describe aquí también funciona bien http://stackoverflow.com/a/16475580/933358 –

+1

Gracias por 'ruby -e 'pone RUBY_PLATFORM'' – Paul

1

No estoy seguro del interruptor de plataforma como 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. Tales como ...

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

De esta manera, esas joyas sólo se utilizan en el entorno de producción, no en el desarrollo.

Tenga en cuenta que creo que bundler seguirá instalándolos en desarrollo (algo relacionado con la comprobación de dependencia), pero en realidad no se cargarán y, por lo tanto, no deberían causar problemas.

+1

Esto puede funcionar, pero en realidad no responde mi pregunta. No pregunté cómo puedo evitarlo, le pregunté si debería/funciona. – jcollum

+0

Estoy de acuerdo que no aborda directamente la cuestión, sin embargo, no aborda el problema subyacente. No es un "problema". Es una alternativa igualmente válida de la que puede no haber tenido conocimiento, y que puede (o no) sentir que es apropiada para su situación específica. –

10

Agregar código a la Gemfile como éste, que excluye/incluye gemas dependiendo de la plataforma OS

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

¿Entonces los documentos son simplemente incorrectos? A eso es a lo que realmente intento llegar. – jcollum

+5

No puede usar bloques 'if' en su Gemfile. Si lo hace, entonces Gemfile.lock se regenerará y modificará cada vez que se acceda al proyecto en diferentes plataformas. –

+0

¿y qué? Suena como un dogma que deberías dejar ir. Desarrollamos OSX y lo implementamos en JRuby. Solo comprobamos en Gemfile.lock que se genera en JRuby. – ffoeg

3

Bündler concepto de plataforma difiere de la comprensión normal de RUBY_PLATFORM coincidentes o RubyGems comportamientos.

Puede encontrar toda la documentación sobre el uso de plataformas de Bündler aquí:

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

Puede que no necesite therubyracer en Windows (que en realidad no funciona), pero es posible que tenga por lo execjs CoffeeScript u otros detalles de activos de la tubería de trabajo adecuadamente

En su caso, lo harán:

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.

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

Eso funciona bastante bien para mí.

+0

Esto es más que una solución que una respuesta – jcollum

0

Una variación de la respuesta de @ ffoeg trabajó para mí, y se ocupa de todos los entornos de ventanas, mientras que solo el 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 que no es ideal para tener diferentes gemfiles, sin embargo, desde que estoy usando unicorn para servir a mi blog Jekyll en Heroku, así que necesito gem unicorn - y esto se basa en kgio el que varias fuentes han confirmado es prácticamente imposible de instalar en ventanas ...

0

rieles 5:

if Gem.win_platform? 
    # Install gem for Windows 
else 
    # Install another gem 
end 
Cuestiones relacionadas