2010-08-30 16 views
4

J'essaye de configurer un gemset RVM via un template Rails 3 puis, via les commandes du template, commencer à utiliser le gemset et installer les gemsets dans le nouveau gemset (nommé d'après l'application). Cela ne semble pas fonctionner correctement. Les nouvelles gemmes ne sont pas installées dans le gemset et en fait le gemset n'est pas créé du tout.Configuration du gemset RVM via Rails 3 template

est ici une partie du code correspondant extrait du fichier modèle:

rvmrc = <<-RVMRC 
rvm_gemset_create_on_use_flag=1 
rvm_trust_rvmrcs=1 
rvm gemset use #{app_name} 
RVMRC 

create_file ".rvmrc", rvmrc 

Puis, plus loin sur la route:

run "cd path/to/new/app" 
run 'gem install bundler --pre' 
run 'bundle install' 

J'ai aussi essayé une version différente:

inside app_name do 
    run 'gem install bundler --pre' 
    run 'bundle install' 
end 

Et une troisième version:

inside app_name do 
    run "rvm gemset create #{app_name} && rvm gemset use #{app_name}" 
    run 'gem install bundler --pre' 
    run 'bundle install' 
end 

Cela fonctionne parfaitement si je viens de cd dans le nouveau dossier de l'application dans la console après le modèle a couru. Je reçois le message RVM: "info: Maintenant, en utilisant gemset 'test_app'." Si j'exécute la commande bundle install à ce stade, les gems sont correctement installés dans le nouveau gemset, mais je ne peux pas obtenir le même résultat si je ne fais que lancer ces commandes à partir du fichier gabarit.

Le journal pour le générateur d'applications dit ceci:

run cd ~/rails3_sites/test_app from "." 
run gem install bundler --pre from "./test_app" 
run bundle install from "./test_app" 

Qu'est-ce que je manque? Toute aide est grandement appréciée. J'utilise ruby ​​1.9.2, d'ailleurs.

Merci,

~ Andrea

Répondre

3

J'ai récemment revisité ce problème. Cela peut être accompli en utilisant l'API RVM Ruby. Je mis les appels à l'API dans un fichier Ruby séparé de mon modèle comme suit:

rvm_lib_path = "#{`echo $rvm_path`.strip}/lib" 
$LOAD_PATH.unshift(rvm_lib_path) unless $LOAD_PATH.include?(rvm_lib_path) 
require 'rvm' 

rvm_ruby = ARGV[0] 
app_name = ARGV[1] 

unless rvm_ruby 
    puts "\n You need to specify a which rvm rubie to use." 
end 

unless app_name 
    puts "\n You need to name your app." 
end 

@env = RVM::Environment.new(rvm_ruby) 

puts "Creating gemset #{app_name} in #{rvm_ruby}" 
@env.gemset_create(app_name) 
puts "Now using gemset #{app_name}" 
@env.gemset_use!(app_name) 

puts "Installing bundler gem." 
puts "Successfully installed bundler" if @env.system("gem", "install", "bundler") 
puts "Installing rails gem." 
puts "Successfully installed rails" if @env.system("gem", "install", "rails") 

template_file = File.join(File.expand_path(File.dirname(__FILE__)), 'templater.rb') 
system("rails new #{app_name} -JT -d mysql -m #{template_file}") 

Si quelqu'un est intéressé j'ai écrit un blog sur Rails 3 modèles en général qui va dans plus en détail:

Cooking Up A Custom Rails 3 Template

+0

merci homme! ces roches, je dois également mettre à jour avant de RVM il a travaillé – corroded

+0

versions récentes de RVM ont extrait l'api rubis dans un gem et se plaindra de l'appel 'unshift' à la ligne 2 ici. Vous pouvez supprimer en toute sécurité les deux premières lignes. –

0

Andrea, excellente approche et un article blog fabuleux. Cependant, le bootstrap RVM ne fonctionne pas.

Voici à peu près les mêmes étapes de RIR pour créer une nouvelle gemset:

ree-1.8.7-2010.02 > require 'rvm' 
true 
ree-1.8.7-2010.02 > @env = RVM::Environment.new('ree') 
#<RVM::Environment environment_name="ree"> 
ree-1.8.7-2010.02 > @env.gemset_create('some_gemset') 
true 
ree-1.8.7-2010.02 > @env.gemset_use!('some_gemset') 
true 
ree-1.8.7-2010.02 > @env.gemset_name 
nil 
ree-1.8.7-2010.02 > 

avis la dernière ligne tente de lire le gemset actuel, qui est nulle (la session de terminal utilisait le gemset par défaut, ainsi c'est vide). Je m'attendais à ce qu'il montre 'some_gemset'. J'ai essentiellement le même comportement lors de l'exécution de votre script: il installe les gemmes dans n'importe quel gemset dans lequel j'exécute le script.

Des pensées ou des suggestions sur ce comportement étrange?

+0

Bonjour Jeff, je n'ai pas pu recréer le comportement que vous avez décrit. Cependant, j'utilise Ruby 1.9.2 (@env = RVM :: Environment.new (ruby-1.9.2-p0 ')). Cela pourrait avoir quelque chose à voir avec la version de Ruby que vous utilisez ou même avec la version de RVM. Essayez d'exécuter 'rvm update' pour mettre à niveau RVM vers la dernière version. Faites-moi savoir si cela persiste. Je voudrais m'assurer que le script n'est pas lié à une version particulière de Ruby. –

0
rvm_lib_path = "#{`echo $rvm_path`.strip}/lib" 
$LOAD_PATH.unshift(rvm_lib_path) unless $LOAD_PATH.include?(rvm_lib_path) 
require 'rvm' 

rvm_ruby = ARGV[0] 
app_name = ARGV[1] 

unless rvm_ruby 
    puts "\n You need to specify a which rvm rubie to use." 
end 

unless app_name 
    puts "\n You need to name your app." 
end 

@env = RVM::Environment.new(rvm_ruby) 
ENV['RVM_RUBY'] = rvm_ruby 

puts "Creating gemset #{app_name} in #{rvm_ruby}" 
@env.gemset_create(app_name) 
puts "Now using gemset #{app_name}" 
@env = RVM::Environment.new("#{rvm_ruby}@#{app_name}") 


puts "Installing bundler gem." 
puts "Successfully installed bundler" if @env.system("gem install bundler --no-ri --no-rdoc") 
puts "Installing rails gem." 
puts "Successfully installed rails" if @env.system("gem install rails --no-ri --no-rdoc") 

template_file = File.join(File.expand_path(File.dirname(__FILE__)), 'template.rb') 
system("rvm #{rvm_ruby}@#{app_name} exec rails new #{app_name} -JT -d mysql -m #{template_file}") 

system("mv #{app_name} #{app_name}.git") 

fonctionne.

Il y a un bug avec RVM où la variable d'instance @rvm_environment ne soit pas réglée correctement à l'aide gemset_use! donc si vous faites @ env.send (: instance_variable_get,: @rvm_environment), il ne reflète pas la mise à jour gemset donc quand vous l'appelez système n'exécute pas dans le bon environnement/gemset. Redéfinir le @env var dans une nouvelle instance de RVM :: Environment résout le problème.

6

Vous pouvez le faire sans utiliser le api rubis RVM. Voici un extrait de notre modèle

current_ruby = %x{rvm list}.match(/^=>\s+(.*)\s\[/)[1].strip 
run "rvm gemset create #{app_name}" 
run "rvm #{current_ruby}@#{app_name} gem install bundler" 
run "rvm #{current_ruby}@#{app_name} -S bundle install" 

file ".rvmrc", <<-END 
rvm use #{current_ruby}@#{app_name} 
END 

Ce trouvera le rubis actuellement sélectionné, créez un gemset avec ce nom puis installez Bundler en elle. Enfin, installe les gems spécifiés dans le Gemfile et crée un fichier .rvmrc.

Vous voyez tout le modèle dans mon dépôt GitHub https://github.com/andyh/Template

+0

Vous voudrez peut-être le 'RVM list' regex être'/^ = (: \ * |>) (. *) \ S + \ s \ [/ ', qui correspond à la Ruby "en cours" ou « par défaut en cours de && "Ruby. – GladstoneKeep