Dans Rails 2.X, je pouvais simplement copier des gemmes dans vendor/gems/gem_name
, ou utilisez la commande rake rake gems:unpack
. Étant donné que Rails3 utilise bundler, il ne semble plus fonctionner. J'ai trouvé la commande bundle package
, mais cela ne fonctionne pas de la même manière.
Donc, juste pour développer un peu à ce sujet:
La façon dont Rails 2 fonctionnait, je pouvais facilement grep pour trouver des choses dans vendor/gems
. S'ils sont regroupés dans .gem
fichiers, ce n'est pas possible. De plus, lors du développement d'un gem/plugin, il est très utile de le placer dans une application Rails pour le tester en contexte. Comment pourrais-je faire de telles choses avec bundler/Rails3? Mon flux de travail est-il intrinsèquement cassé en quelque sorte?
Répondre à la deuxième partie de votre question, développer un plugin/gem et l'envoyer avec l'application Rails sans rendre le gem accessible au public, vous pouvez le faire
Gemfile
gem 'my_private_gem', :path => "vendor/gems/my_private_gem-VERSION"
en supposant que vous avez effectué un gem unpack my_private_gem --target vendor/gems
note: paquet bundle décompresse toutes les gemmes (autant que dans Gemfile.lock). Je ne voudrais pas de ces conneries.
L'équivalent Bundler est bundle package
. Il regroupe tous les fichiers .gem spécifiés dans le Gemfile dans vendor/cache
pour que les futures installations obtiennent les gemmes de ce cache plutôt que de http://rubygems.org/
L'équivalent Bundler correct est bundle install --deployment
. Cela installera les gemmes, dans leur état déballé, dans vendor/bundle
.
C'est ce qui a fonctionné pour moi:
gem unpack <GEM_NAME> [-v <VERSION>] --target vendor/gems
gem specification <GEM_NAME> [-v <VERSION>] --Ruby > vendor/gems/<GEM_NAME>[-<VERSION>].gemspec
Par exemple:
gem unpack sidekiq-pro -v 2.1.4 --target vendor/gems
gem specification sidekiq-pro -v 2.1.4 --Ruby > vendor/gems/sidekiq-pro-2.1.4.gemspec
La première commande décompresse la gemme dans le répertoire vendeur/gemmes. Cependant, cela ne contient pas le gemspec. La deuxième commande crée le gemspec associé. Il est à noter qu'une autre affiche a mentionné quelque chose de similaire. Cette solution écrit correctement le gemspec au format Ruby au lieu de yaml.
Vous pouvez ensuite mettre à jour votre Gemfile pour pointer vers la gemme vendue:
gem '<GEM_NAME>', '<VERSION>', :path => "vendor/gems/<GEM_NAME>-<VERSION>"
Par exemple:
gem 'sidekiq-pro', '2.1.4', :path => "vendor/gems/sidekiq-pro-2.1.4"
Envisagez d'utiliser une infrastructure de développement "hébergée" fournie par la gemme hôte_gem_development .
Développer des gemmes est souvent délicat car ils agissent comme des projets distincts en ce qui concerne les applications dans lesquelles vous les utilisez.
L'infrastructure de développement "hébergée" facilite le développement de gemmes en les incluant (les rendant "hébergées par") dans votre application en direct. Ensuite, vous mettez à jour le code de votre gemme comme vous mettez à jour le code d'application normal.