2011-12-19 9 views
21

Esto se produce debido a que el directorio de instalación de la gema utilizado por el comando gem, ve al utilizar gem env, se establece en algo así como:¿Por qué estamos instalando Ruby 1.9.2/1.9.3 gems en una carpeta 1.9.1?

<base_ruby_dir>/lib/ruby/gems/1.9.1 

Mi pregunta es ¿por qué?

no debería llamarse la carpeta:

<base_ruby_dir>/lib/ruby/gems/1.9.x 

o

<base_ruby_dir>/lib/ruby/gems/1.9 

o de lo contrario no podría haber uno por cada versión de Ruby, como:

c:/ruby191/lib/ruby/gems/1.9.1 
c:/ruby192/lib/ruby/gems/1.9.2 
c:/ruby193/lib/ruby/gems/1.9.3 
No

un problema crítico que sé, me estaba preguntando.

Respuesta

28

En Ruby 1.9.0, la interfaz C se cambió de la serie Ruby 1.8.

Las gemas que se compilan con el código nativo tuvieron que volver a compilarse.

La interfaz se cambió nuevamente en Ruby 1.9.1 y se mantuvo igual en Ruby 1.9.2 & 3. Esto explica el 1.9.1 que está viendo en su camino.

La idea es que puede instalar diferentes versiones de Ruby en su sistema y que las gemas se compartirían dentro de grupos que tengan la misma C api. Así que Ruby 1.8.6 y 1.8.7 podrían compartir sus gemas, y también Ruby 1.9.1, .2 y .3.

No es necesariamente la mejor idea, sin embargo. En cualquier caso, la mayoría de la gente usa rvm para acceder a diferentes versiones de Ruby y rvm guarda las gemas separadas para cada versión, independientemente de la versión de C api.

+0

Ok, entiendo eso. Entonces 1.9.1 significa que la gema cumple con la interfaz C utilizada en Ruby 1.9.1? Este tipo de expone detalles de implementación ¿no? Desde el punto de vista de un usuario final de una joya, ¿por qué me importa? ¿Y alguna vez veré dos carpetas una al lado de la otra como 1.9.1 y 1.9.4? Si no, otra vez, ¿por qué me importa? – Ben

+0

Derecha. ¡La C Api * definitivamente * expone detalles de implementación! Los usuarios de gemas no deberían preocuparse por la ruta. Respuesta editada para las dos últimas preguntas –

+0

Para mí, la pregunta es sobre la convención de nomenclatura de directorios. Si sabemos que un cambio en la API C de Ruby va a provocar la recompilación de todas las gemas que usan esa versión de Ruby, entonces tengo una carpeta llamada 1.9.1 con gemas en, * o * una carpeta llamada 1.9.2 (o lo que sea). Si no puedo tener ambos (para una versión de Ruby), entonces 1.9.x sería más sensato.Nunca he visto la misma carpeta utilizada para almacenar las gemas de varias versiones de Ruby. ¿Es realmente un caso de uso real? – Ben

0

Creo que es porque estas versiones deberían ser compatibles, y si tuviera directorios separados, tendría que volver a instalar todas sus gemas. De esta forma puede actualizar la versión de ruby ​​sin tener que volver a instalar todas las gemas.

+1

Hmm, sí, tiene sentido. Pero en ese caso, ¿por qué no llamar a la carpeta 1.9 o 1.9.x? Me parece extraño. – Ben

+0

Es lo mismo con los paquetes de Ruby Debian. Instalé 1.9.2 desde un paquete titulado ruby1.9.1. El ejecutable fue nombrado así también. – Linuxios

+0

No hay garantía (desafortunadamente) de que el ABI permanezca igual para todo el ciclo de vida 1.9.x. Si 1.9.4 repentinamente utiliza un ABI que rompe la compatibilidad con 1.9.1-1.9.3, entonces su ruta 1.9.x de repente recibe un nombre incorrecto. – jgoldschrafe

Cuestiones relacionadas