¿Cuáles son las mejores prácticas para actualizar versiones de Rails con todas las dependencies?

cada vez que ocurre un bache en la versión de los principales Rails, a veces es un verdadero problema actualizar las aplicaciones existentes para los Rails (4.x, 5.x, etc.), dado que hay muchas gems que pueden depender de versiones anteriores de Rails (ActiveRecord, ActionController, ActiveModel, etc.). Y esas gems dependientes a veces toman demasiado time para ser actualizadas (ya sea no mantenidas, less activas o no disponibles para el equipo mantenedor principal, incluso para aceptar requestes de extracción). ¿Cuál es la solución que la gente de alnetworkingedor sigue por lo mismo?

Un flujo de trabajo que la gente sugiere es tejer todas las gems dependientes y luego cambiar lo que quieras y seguir actualizándolos desde sus respectivas twigs maestras / principales. Me encantaría escuchar lo que las personas siguen en su flujo de trabajo.

Yo diría que debería quitar / replace las gems que no tienen una versión compatible disponible poco después de una actualización importante de Rails.

Las versiones Beta de Rails 5 estuvieron disponibles casi 6 meses antes de que se lanzara Rails 5. Si una gem no se actualiza dentro de ese time, probablemente no se actualice más tarde o se ralentizará en cada otra actualización de Rails.

Veo varias opciones cuando te encuentras con esa situación:

  • Revisa la razón por la que estás usando tat gem. Algunas veces usa una gem para algunos methods simples. Reescribe los methods de tu aplicación (o tu propia joya) y elimina esta dependencia.

  • ¿Hay otros proyectos disponibles que resuelvan el mismo problema? A veces estos proyectos incluso tienen una mejor estructura u otros beneficios. Puede considerar cambiar a esas gems. Con suerte, encapsulaste la gem antigua y no personalizaste demasiado esa gem, porque eso hace que sea más difícil replacela.

  • Puede considerar bifurcar esa gem y resolver el problema usted mismo (puntos de bonificación por enviar una request de extracción a la gem original). Esa es una buena solución a corto ploop. Pero te gustará mucho tener un problema similar con esta joya con la próxima versión de Ruby. Además, cuando trabajas con una versión bifurcada de una gem, estás solo. ¿De verdad quieres mantener esa versión de gem privada para los años siguientes?

Con cada gem que agregue a su stack, su aplicación entraña un costo y un riesgo. El costo de ver esa gem, ¿cómo cambia ?, ¿hay soluciones de security? Y el riesgo de que la gem se abandone en algún momento.

Puede haber algunas cosas que puede hacer por adelantado para disminuir el dolor, cuando se encuentra en situaciones como esta:

  • Evite agregar gems a su aplicación, cuando solo necesita unos pocos methods simples de ayuda de esa gem.

  • Encapsula esa gem con tu propia envoltura. Y tenga una buena cobertura de testing para su interfaz de wrappers. Eso hace que sea mucho más fácil cambiar la gem subyacente.

  • Siempre esté preparado para quitar / replace las gems tan pronto como tenga un problema con ellas. Esperar a que haya un mantenedor de gems externo probablemente no sea una buena estrategia cuando tiene problemas para resolver en su aplicación.