Comment puis-je spécifier une gemme locale dans mon Gemfile?


Réponses:


541

Je pense que vous pouvez le faire:

gem "foo", path: "/path/to/foo"

10
Un chemin codé en dur convient parfaitement pour une session de piratage rapide, mais la solution de gem local de bloudermilk est plus efficace pour les projets sous contrôle de version. Il vous permet de continuer à archiver les deux projets - gemme et projet utilisant la gemme - de sorte que d'autres n'aient pas à vérifier la source de la gemme ou à partager les mêmes chemins.
mahemoff

4
Vous pouvez rendre cela légèrement plus propre en utilisant un lien symbolique .gitignored vers votre gem local dans votre répertoire de projet - de cette façon, vous pouvez utiliser le contrôle de source sur les deux projets séparément et d'autres peuvent faire de même sans avoir une structure de répertoire identique.
Dan

7
Quelque chose à surveiller pourrait être le printemps. Si vous utilisez un chemin local pour votre gemme, vous pourriez remarquer des versions en cache de votre gem local comme je l'ai fait dans la console rails. S'il ne semble pas que vos modifications locales soient récupérées, essayez spring stopde voir si c'est bien le problème.
Jason R

1
L'ajout du chemin de la gemme locale à config / spring.rb semble aider à récupérer les modifications de votre gem local après le redémarrage de la console / du serveur rails.
Jason R

5
Une meilleure façon de le faire ici: rossta.net/blog/…
Cyzanfar

230

En plus de spécifier le chemin (comme l'a mentionné Jimmy), vous pouvez également forcer Bundler à utiliser une gemme locale pour votre environnement uniquement en utilisant l'option de configuration suivante:

$ bundle config local.GEM_NAME /path/to/local/git/repository

Cela est extrêmement utile si vous développez deux gemmes ou une gemme et une application de rails côte à côte.

Notez cependant que cela ne fonctionne que lorsque vous utilisez déjà git pour votre dépendance, par exemple:

# In Gemfile
gem 'rack', :github => 'rack/rack', :branch => 'master'

# In your terminal
$ bundle config local.rack ~/Work/git/rack

Comme on le voit sur les documents .


J'ai des problèmes avec cela parce que j'utilise BUNDLE_PATH(construire un package pour la distribution). Lorsque vous faites ce que vous avez suggéré, ou la réponse de Jimmy, cela ne fait qu'un using, et pas réellement l'installation dans mon BUNDLE_PATHdossier. Je n'ai pas pu comprendre cela, une aide?
Automatico

2
Notez que cela ne fonctionnera pas avec un gemspec , par discussion ici .
davetapley

31
Pour désactiver le remplacement local:bundle config --delete local.GEM_NAME
alxndr

J'ai dû supprimer la directive de version de la ligne gemme pour que cela fonctionne.
Epigene

4
Si vous souhaitez utiliser une branche différente dans le développement de la production, vous devez également définir bundle config disable_local_branch_check trueou Bundler se plaindra de la branche. Soyez prudent avec cela, car les vérifications sont censées empêcher les validations incorrectes d'entrer Gemfile.lock. Documents ici: bundler.io/v1.12/git.html
Leo

33

Vous pouvez également référencer une gemme locale avec git si vous travaillez dessus.

gem 'foo',
  :git => '/Path/to/local/git/repo',
  :branch => 'my-feature-branch'

Ensuite, si ça change, je cours

bundle exec gem uninstall foo
bundle update foo

Mais je ne suis pas sûr que tout le monde doive exécuter ces deux étapes.


5
c'est génial, mais ce n'est pas très pratique si vous développez activement la gemme ... parce que vous devrez valider chaque changement et bundle uninstall <gem> && bundle install , pour chaque changement que vous souhaitez refléter sur votre application
Ramsès

18

Afin d'utiliser le référentiel de gemmes local dans un projet Rails, suivez les étapes ci-dessous:

  1. Vérifiez si votre dossier gem est un référentiel git (la commande est exécutée dans le dossier gem)

    git rev-parse --is-inside-work-tree
  2. Obtenir le chemin du référentiel (la commande est exécutée dans le dossier gem)

    git rev-parse --show-toplevel
  3. Configuration d'un remplacement local pour l'application de rails

    bundle config local.GEM_NAME /path/to/local/git/repository

    GEM_NAMEest le nom de votre bijou et /path/to/local/git/repositoryest la sortie de la commande au point2

  4. Dans votre application, Gemfileajoutez la ligne suivante:

    gem 'GEM_NAME', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
  5. La course bundle installdevrait donner quelque chose comme ceci:

    Using GEM_NAME (0.0.1) from git://github.com/GEM_NAME/GEM_NAME.git (at /path/to/local/git/repository) 

    GEM_NAMEest le nom de votre bijou et /path/to/local/git/repositorydu point2

  6. Enfin, exécutez bundle list, non gem listet vous devriez voir quelque chose comme ceci:

    GEM_NAME (0.0.1 5a68b88)

    GEM_NAMEest le nom de ton bijou


Quelques cas importants que j'observe en utilisant:

Rails 4.0.2  
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux] 
Ubuntu 13.10  
RubyMine 6.0.3
  • Il ne semble RubyMinepas montrer les gemmes locales comme une bibliothèque externe. Plus d'informations sur le bug peuvent être trouvées ici et ici
  • Quand je change quelque chose dans le joyau local, pour être chargé dans l'application rails, je devrais stop/startle serveur rails
  • Si je change la versiongemme, stopping/startingle serveur Rails me donne une erreur. Afin de le réparer, je spécifie la version gem dans l'application rails Gemfilecomme ceci:

    gem 'GEM_NAME', '0.0.2', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'

0

Vous pouvez référencer des gemmes avec source: source: 'https://source.com', git repository (:github => 'git/url')et avec chemin local :path => '.../path/gem_name'.
Vous pouvez en savoir plus sur Gemfiles et comment les utiliser dans cet article.


-4

Si vous voulez aussi la branche:

gem 'foo', path: "point/to/your/path", branch: "branch-name"

Cela ne fonctionne pas, génère une erreur: Only gems with a git source can specify a branch.
KenB
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.