2010-12-02 14 views
14

¿Puedo usar dos versiones de una gema en una aplicación? Estoy tratando de utilizar dos carriles de plugins para trabajar juntos:Usa 2 versiones de gemas al mismo tiempo

  1. LinkedIn https://github.com/pengwynn/linkedin de Pengwynn de llamadas a la API de LinkedIn, tiene una dependencia de oauth (~> 0.3.5)
  2. OmniAuth para la conexión del usuario a través de múltiples bienestar sitios web conocidos, tiene una dependencia de oauth 0.4.0

Cuando intento algo en rieles me sale este mensaje de error:

$ rails server 
c:/Ruby187/lib/ruby/gems/1.8/gems/bundler-1.0.7/lib/bundler/resolver.rb:129:in `resolve': Bundler could not find compatible versions for gem "oauth": (Bundler::VersionConflict) 
    In snapshot (Gemfile.lock): 
    oauth (0.4.4) 

    In Gemfile: 
    linkedin depends on 
     oauth (~> 0.3.5) 

Running `bundle update` will rebuild your snapshot from scratch, using only 
the gems in your Gemfile, which may resolve the conflict. 

Tratando de actualización solo paquete congela mi terminal

¿Es posible utilizar estos dos complementos al mismo tiempo?

Respuesta

11

Usar dos versiones de una sola gema generalmente significa: utilizar dos versiones de la misma clase.

No es posible sin hacer modificaciones a estas gemas. Puede tratar de colocar clases creadas en algún módulo, resolver conflictos en métodos importados en otras clases, y así sucesivamente. En general, no es una tarea fácil, y generalmente el efecto no vale la pena.

Lo que debería hacer en tales casos es pedirle a los gerentes de gema que actualicen las dependencias, o intente hacerlo usted mismo.

Tal vez puede degradar (usar una versión anterior de) una de estas gemas, a la versión en la que las dependencias eran las mismas.

+0

, gracias por su respuesta, voy a dejar de molestarse en tratar de utilizar tanto en la actualidad. –

2

Desafortunadamente, en Ruby la única manera de hacerlo es solución (sic!) Esas joyas, así que utilizan las dependencias compatibles

En general, cuando se construye un complejo software de Ruby y que tienen una situación de este tipo WE - desarrolladores de Ruby - No puedo hacer mucho. Y esto es realmente malo, ya que el desarrollo en Ruby también debe enfocarse en este tema.

En lugar de proporcionar a sus clientes nuevas funciones o solicitudes de cambio, uno tiene que vivir con Ruby llamado: "gem hell".

Otra característica principal del "infierno de las gemas" es que no siempre el último lanzamiento de la gema es el bueno.

  • A menudo, una gema no sigue la política de versiones semánticas, y puede introducir importantes modificaciones de la API.
  • A menudo, el lanzamiento de una nueva gema puede introducir nuevos errores en las funciones que anteriormente funcionaban.

Otros lenguajes de programación tienen la opción de manejar este tipo de problemas. Simplemente busque "versiones múltiples de Java de la misma clase" y encontrará muchos recursos.

Lo que puedo sugerir para los más pequeños tipo de aplicaciones es:

  • estar al día con los comunicados todas las últimas gemas

Lo que puedo sugerir para ampliar la clase de aplicaciones, cuando arriba no es una opción:

  • divida su aplicación en varias aplicaciones más pequeñas, servicios. Esto los separará y correrá el riesgo de tener un "infierno de gemas" más pequeño. Si sucede, es probable que no les suceda a todos. Además, diferentes aplicaciones pueden usar diferentes versiones de gemas.

  • interruptor para JRuby donde esos problemas pueden ser - en teoría - resuelto a través de las capacidades de Java

+0

podría indicar cómo Jruby puede ayudar: cambie a JRuby donde esos problemas pueden resolverse, en teoría, a través de las capacidades de Java. – whizcreed

+0

Tomasz, podría mirar mi pregunta más reciente: https://stackoverflow.com/questions/28233471/unable-to-use-surveyor-gem Tal vez mi infierno es relativamente manejable .. – whizcreed

+0

En Java uno puede tener clasificadores personalizados . Es decir, uno puede cargar múltiples versiones de la misma clase. Esta es la teoría. No he encontrado el uso práctico de esta idea. Hubo OSGi, pero aparentemente esto se abandonó a favor de algún otro estándar Java. Y como JRuby es una mezcla de ambos, esperaba que hubiera una manera, pero no estoy seguro si alguien sigue este camino ... –

Cuestiones relacionadas