2010-12-07 36 views
2

Juste un peu d'arrière-plan, je viens d'un arrière-plan C#/typé statique. Par conséquent, j'ai tendance à penser en termes de .dlls. Donc, si je travaillais dans un projet, je référencerais mes DLLs requises et ce serait cela. Étant nouveau pour Ruby and Rails, je trouve que je peux faire quelque chose de mal. Par exemple, je crée une application Rails à la maison en utilisant les gems que j'ai localement. En utilisant un ordinateur différent (disons un ordinateur de travail), je tente de travailler sur le projet seulement pour trouver que j'utilise différentes versions des gemmes. Après avoir effectué une installation groupée, je suis de retour à un projet de travail.Gestion des versions gemmes/dépendances pour Rails

Le problème que j'ai avec ceci est que ma bibliothèque de gemmes devient «désordonnée». Je me retrouve avec plusieurs versions de la même gemme. Est-ce la façon dont les autres travaillent? Lors de l'utilisation d'une gemme (à partir d'un require) sera-t-il par défaut à la dernière version? J'ai l'impression de ne pas gérer correctement les dépendances, bien que, comme je l'ai mentionné, je suis nouveau dans le monde de Ruby.

Devrais-je simplement inclure mes dépendances, puis procéder à une installation groupée chaque fois que j'ai des dépendances différentes/manquantes? Que se passe-t-il si je souhaite passer à une version plus récente d'un bijou? Serait-ce un cas de mettre à jour le fichier gemfile que le bundle utilise et de continuer avec lui?

Répondre

8

Oui, bundler est le moyen d'aller travailler avec des dépendances avec Ruby on Rails. Pourquoi ? D'abord, parce qu'il est livré avec (au moins pour la version 3.0). Deuxièmement, parce que c'est simple comme l'enfer (contrairement à Java avec Java).

Une liste non exhaustive de fonction:

  • il vous permet de déclarer un ou plusieurs dépôt de pierres précieuses pour récupérer des pierres précieuses de
  • pour regrouper vos dépendances par l'environnement (développement, production ...)
  • pour spécifier la version que vous souhaitez

et ainsi de suite. Pour plus à ce sujet, vérifiez ceci http://gembundler.com/rationale.html

En ce qui concerne votre question: oui, bundler prendra la dernière version disponible est aucun est spécifié.

En outre, je voudrais ajouter un désavantage: vous ne pouvez pas spécifier une version de gem selon le système d'exploitation. Par exemple, nokogiri a une version Linux et une version gagnante.

+0

Nice one. Je ne savais pas que vous pouviez omettre les versions dans le fichier bundle. Résout mon problème de la génération de rupture pour les différences de version de 0.0.1 – Finglas

1

Le comportement par défaut lors de la demande d'un module dans une gemme est de supposer que vous voulez la dernière version de la gemme si vous en avez installé plusieurs. Vous pouvez changer cela en specifying which version you besoin dans une application spécifique comme celui-ci:

gem "rails", "2.3.8" 

Avant de quoi que ce soit besoin de la pierre précieuse. Cela garantit que cette application utilisera la version spécifiée de la gemme, même si une version plus récente est installée. Vous pouvez bien sûr nettoyer les versions obsolètes de vos gemmes installées chaque fois que vous n'en avez plus besoin ou si vous utilisez le bundler de manière cohérente: effacez simplement tout et exécutez bundler à nouveau pour que vos gemmes soient installées.

Un autre outil utile est le Ruby Version Manager (RVM), en plus de gérer différentes versions de ruby, il fournit une fonctionnalité appelée gemsets qui vous permet d'isoler différentes applications ou environnements les uns des autres. C'est App A peut avoir son gemset séparé avec toutes ses gemmes nécessaires, et App B ont un autre gemset avec seulement ses gemmes nécessaires.Cela permettra de réduire l'encombrement dans vos dépendances un peu.