Настройка гемсета RVM с помощью шаблона Rails 3

Я пытаюсь настроить набор драгоценных камней RVM через шаблон Rails 3, а затем с помощью команд в шаблоне начать использовать набор драгоценных камней и установить драгоценные камни в новый набор драгоценных камней (названный в честь приложения). Это не работает должным образом. Новые драгоценные камни не устанавливаются в набор драгоценных камней, и фактически набор драгоценных камней вообще не создается.

Вот часть соответствующего кода, извлеченного из файла шаблона:

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

create_file ".rvmrc", rvmrc

Потом дальше по дороге:

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

Я также пробовал другую версию:

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

И третья версия:

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

Он отлично работает, если я просто перехожу в новую папку приложения в консоли после запуска шаблона. Я получаю сообщение RVM: «информация: теперь используется gemset 'test_app'». Если я запущу команду установки пакета в этот момент, драгоценные камни будут правильно установлены в новый набор драгоценных камней, но я не смогу получить тот же результат, если просто запущу эти команды из файла шаблона.

В журнале генератора приложений говорится следующее:

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

Что мне не хватает? Любая помощь приветствуется. Кстати, я использую рубин 1.9.2.

Спасибо,

~ Андреа


person Andrea Singh    schedule 30.08.2010    source источник


Ответы (4)


Вы можете сделать это без использования rvm ruby ​​API. Вот фрагмент из нашего шаблона

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

Это найдет текущий выбранный рубин, создаст набор драгоценных камней с этим именем, а затем установит в него упаковщик. Наконец, устанавливает гемы, указанные в Gemfile, и создает файл .rvmrc.

Вы видите весь шаблон в моем репозитории github https://github.com/andyh/Template.

person Andy Henson    schedule 01.03.2011
comment
Вы можете захотеть, чтобы регулярное выражение rvm list было /^=(?:\*|>)\s+(.*)\s\[/, что соответствует текущему Ruby или текущему Ruby && по умолчанию. - person GladstoneKeep; 11.09.2013

Недавно я вновь обратился к этой проблеме. Это можно сделать с помощью RVM Ruby API. Я поместил вызовы API в файл Ruby отдельно от моего шаблона следующим образом:

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}")

Если кому-то интересно, я написал сообщение в блоге о шаблонах Rails 3 в целом, в котором это рассматривается более подробно:

Приготовление пользовательских Rails 3 Шаблон

person Andrea Singh    schedule 12.10.2010
comment
Спасибо чувак! это круто, также мне нужно сначала обновить rvm, прежде чем он заработает - person corroded; 13.01.2011
comment
Последние версии RVM извлекли ruby ​​API в отдельный гем и будут жаловаться на вызов unshift в строке 2 здесь. Вы можете смело удалить первые две строки. - person Tyler Gannon; 16.04.2013

Андреа, отличный подход и потрясающая статья в в блоге. Однако начальная загрузка RVM не работает.

Вот примерно такие же шаги в irb для создания нового гемсета:

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 > 

Обратите внимание, что последняя строка пытается прочитать текущий гемсет, который равен нулю (сеанс терминала использовал гемсет по умолчанию, поэтому он пуст). Я ожидал, что он покажет «some_gemset». По сути, я получаю такое же поведение при запуске вашего сценария: он устанавливает драгоценные камни в любой набор драгоценных камней, в котором я оказался при запуске сценария.

Любые мысли или предложения по этому странному поведению?

person Jeff Poulton    schedule 28.10.2010
comment
Привет, Джефф, я не смог воссоздать поведение, которое ты описал. Однако я использую Ruby 1.9.2 (@env = RVM::Environment.new('ruby-1.9.2-p0')). Это может быть связано с конкретной версией Ruby, которую вы используете, или даже с версией RVM. Попробуйте запустить «rvm update», чтобы обновить RVM до последней версии. Дайте мне знать, если это не исчезнет. Я хотел бы убедиться, что скрипт не привязан к конкретной версии Ruby. - person Andrea Singh; 29.10.2010

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")

работает.

В rvm есть ошибка, из-за которой переменная экземпляра @rvm_environment не устанавливается должным образом с помощью gemset_use! поэтому, если вы делаете @env.send(:instance_variable_get, :@rvm_environment), это не отражает обновленный набор драгоценных камней, поэтому, когда вы вызываете систему, она не выполняется в правильной среде/наборе драгоценных камней. Повторная установка переменной @env в новый экземпляр RVM::Environment устраняет проблему.

person shwoodard    schedule 29.10.2010