2017-04-23 3 views
0

Je travaille avec une gemme qui a une dépendance dont la version doit varier en fonction de la version de Ruby en cours d'exécution lorsque la gemme est installée. Plus précisément, la version actuelle de la gemme nio4r nécessite Ruby version> = 2.2.2, et la gemme async qui a besoin de nio4r devrait idéalement être capable de fonctionner sur n'importe quelle version de Ruby> = 2.0.Comment spécifier la version de dépendance Gem au moment de l'installation Gem

J'ai essayé de mettre un peu de code dans le fichier gemspec pour modifier la version, mais il semble qu'il est exécuté lorsque le bijou est construit, pas quand il est installé . En d'autres termes, la version de nio4r est codée en dur dans la gemme en fonction de la version de Ruby utilisée pour construire la gemme. Voici le code que j'ai essayé dans le gemspec (say est une commande OS X pour parler une chaîne et était très utile pour savoir ce qui se passait et quand, je l'enlèverais bien sûr plus tard).

# Recent versions of nio4r require a Ruby version >= 2.2.2. 
# If the version used is earlier, load an earlier version of nio4r. 
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.2.2') 
    `say Installing latest version of nio4r` 
    spec.add_runtime_dependency "nio4r" 
else 
    `say Installing nio4r version 1.2.1` 
    spec.add_runtime_dependency "nio4r", '1.2.1' 
end 

Comme je l'ai dit, ce petit bijou a été exécuté le build et non install. Je suis conscient que je peux utiliser bundler pour ce genre de chose et mettre la spécification dans le Gemfile, mais autant que je sache, ce fichier ne sera pas utilisé lorsque la gemme est gem install 'ed.

Comment puis-je faire varier la version gem de la personne dépendante au moment de l'installation de la gemme?

Je suis à la recherche d'une solution automatisée, c'est-à-dire n'impliquant aucune intervention de l'utilisateur de cette gemme. En outre, cette gem sera installée à la suite de l'installation d'une autre gemme, donc je ne veux pas que l'utilisateur doive suivre les changements apportés à sa gemme dépendante et doit modifier le Gemfile manuellement. Ce serait en quelque sorte une violation de la loi de Demeter.

Répondre

0

Il n'y a pas moyen que je connaisse pour mettre à jour dynamiquement la version rubis dans le fichier gemspec de la pierre précieuse, mais vous pouvez le verrouiller à une version rubis spécifique:

spec.required_ruby_version = '>= 2.2.2' 

Sinon, vous pouvez suggérer aux consommateurs de votre gem (dans le fichier README peut-être) qu'ils doivent forcer une version spécifique de nio4r s'ils utilisent des versions de ruby ​​plus anciennes que 2.2.2.

En Gemfile un nouveau Ruby:

ruby "2.4.1" 
gem "keiths_gem" 

Dans un Gemfile avec une ancienne version de Ruby:

ruby "2.1.0" 
gem "keiths_gem" 
gem "nio4r", '1.2.1' 
+0

Merci, mais je suis à la recherche d'une solution qui est automatisée, c'est , n'implique aucune intervention de l'utilisateur de cette gemme. En outre, cette gem sera installée à la suite de l'installation d'une autre gemme, donc je ne veux pas que l'utilisateur doive suivre les changements apportés à sa gemme dépendante et doit modifier le Gemfile manuellement. Ce serait en quelque sorte une violation de la loi de Demeter. J'aurais dû le mentionner, je le ferai maintenant. –