Comment spécifier des fichiers .gem locaux dans mon Gemfile?

158

J'ai quelques fichiers gem que j'installe via gem install xx.gem. Puis-je dire à Bundler de les utiliser? Ou dois-je spécifier le chemin source?

ddayan
la source
En relation: stackoverflow.com/questions/4487948/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

281

Ce n'est pas strictement une réponse à votre question sur l'installation des .gempackages, mais vous pouvez spécifier toutes sortes d'emplacements gemme par gemme en éditant votre Gemfile .

La spécification d'un :pathattribut installera le gem à partir de ce chemin sur votre machine locale.

gem "foreman", path: "/Users/pje/my_foreman_fork"

Alternativement, la spécification d'un :gitattribut installera le gem à partir d'un dépôt git distant.

gem "foreman", git: "git://github.com/pje/foreman.git"

# ...or at a specific SHA-1 ref
gem "foreman", git: "git://github.com/pje/foreman.git", ref: "bf648a070c"

# ...or branch
gem "foreman", git: "git://github.com/pje/foreman.git", branch: "jruby"

# ...or tag
gem "foreman", git: "git://github.com/pje/foreman.git", tag: "v0.45.0"

(Comme @JHurrah l'a mentionné dans son commentaire .)

pje
la source
Pour certains pare-feu, le protocole git peut également poser problème. Dans ce cas, essayezgem "foreman", :git => "https://github.com/pje/foreman.git"
kode
61

Il semble que le bundler ne puisse pas utiliser les fichiers .gem prêts à l'emploi. Le pointage du chemin: vers un répertoire contenant des fichiers .gem ne fonctionne pas. Certaines personnes ont suggéré de configurer un serveur gem local (geminabox, stickler) à cet effet.

Cependant, ce que j'ai trouvé beaucoup plus simple est d'utiliser un "serveur" gem local à partir du système de fichiers: il suffit de mettre vos fichiers .gem dans un répertoire local, puis d'utiliser "gem generate_index" pour en faire un référentiel Gem

mkdir repo
mkdir repo/gems
cp *.gem repo/gems
cd repo
gem generate_index

Enfin pointez le bundler vers cet emplacement en ajoutant la ligne suivante à votre Gemfile

source "file://path/to/repo"

Si vous mettez à jour les gemmes dans le référentiel, assurez-vous de régénérer l'index.

Martin Thiede
la source
6
Merci! De plus, j'avais besoin d'une troisième barre oblique pour faire "file: /// Absolute / Path / to / repo"
Anna
5
Ne serait-il pas plus simple d'exécuter "gem server" sur la ligne de commande et d'ajouter la source " localhost: 8808 " à votre Gemfile
Anna
C'est vraiment cool Martin! Merci pour le partage, c'est exactement ce que je recherchais car je ne voulais pas dépendre de l'exécution d'un gem serverni je ne voulais héberger l'ensemble du projet, juste le fichier .gem.
Leo Gallucci
6
Conseil bonus: vous pouvez contourner l'exigence de chemin absolu en utilisant File.expand_path comme cecisource "file://#{File.expand_path('.')}/chef-11.10.0.dev.2"
Leo Gallucci
Ça ne marche pas pour moi. Mac OS X. Bundler v1.11.2:Could not fetch specs from file://Users/nakilon/....../
Nakilon
44

Je décompresserais votre bijou dans le dossier du fournisseur d'application

gem unpack your.gem --target /path_to_app/vendor/gems/

Ajoutez ensuite le chemin sur le Gemfile pour lier le gem décompressé.

gem 'your', '2.0.1', :path => 'vendor/gems/your'
edap
la source
29

Par défaut, Bundler vérifiera d'abord votre système et s'il ne trouve pas de gemme, il utilisera les sources spécifiées dans votre Gemfile.

JHurrah
la source
Vrai. mais que se passe-t-il si je ne l'ai pas déjà installé? (lors du déploiement sur un serveur) Impossible de trouver Imlib2-Ruby-0.5.2 dans l'une des sources. La commande est terminée
ddayan
184
vous pouvez pointer vers un répertoire local avec gem "gemname",: path => "~ / some / local / path"
JHurrah
5
Je pense que: path nécessite le dossier gem avec le fichier gemspec. Je n'ai que des fichiers .gem que je souhaite installer.
ddayan
1
Ok donc le déploiement du cap a réussi, mais le gem n'a pas été installé "Aucun fichier à charger - vips": /
ddayan
4
Ce n'est certainement pas vrai, du moins plus longtemps. Bundler ne regarde pas vos gemmes système, et ne passe que par ce qui se trouve dans le Gemfile. Une des raisons pour lesquelles c'est si terrible.
bioneuralnet
6

Vous pouvez forcer le bundler à utiliser les gemmes que vous déployez en utilisant "bundle package" et "bundle install --local"

Sur votre machine de développement:

bundle install

(Installe les gemmes requises et crée Gemfile.lock)

bundle package

(Cache les gemmes dans le vendeur / cache)

Sur le serveur:

bundle install --local

(--local signifie "utiliser les gemmes du vendeur / cache")

Henry Collingridge
la source
Que faire si je ne peux rien installer sur le serveur? Dans ce cas, j'ai besoin de construire avec rake mais le serveur n'a pas de gemme que j'utilise pour la construction; mais je n'ai aucun problème à vérifier les dépendances.
Henrik
"bundle install" ne fonctionnait pas pour moi si la gemme n'était pas incluse dans ma source Gemfile "existante.
Anna
Il suffit de supprimer le fichier gem forme temporairement le fichier de pierres précieuses avant de faire bundle installAprès cela, copiez le Gemfile au fournisseur / cache , ajoutez le dos de pierres précieuses au Gemfile et exécuter bundle install --local
bert Bruynooghe
1
bundle packageest une excellente suggestion, même maintenant, trois ans plus tard. Si votre version de Bundler est antérieure à la version 2.0 (pas encore publiée au moment de la rédaction de cet article), vous devrez l'utiliser bundle package --allsi vous souhaitez inclure des gemmes avec pathou des gitdépendances. Cependant, cela vous donnera un rappel utile s'il détecte de telles dépendances.
L2G
1
FYI: cela peut ne pas fonctionner aussi bien que vous l'espérez si vous développez sur une plate-forme différente de celle sur laquelle vous déployez (par exemple, développer sur macOS, déployer sur Linux). Selon la --localdocumentation: "Notez que si un joyau spécifique à la plate-forme existe sur rubygems.org, il ne sera pas trouvé."
Liam Dawson
1

Ajout .gemà vendor/cachesemble fonctionner. Aucune option requise dans Gemfile.

Victor Moroz
la source