Настройка gemset RVM через шаблон Rails 3 - PullRequest
4 голосов
/ 31 августа 2010

Я пытаюсь настроить набор гемов 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'."Если в этот момент я выполню команду bundle install, гемы будут правильно установлены в новый набор гемов, но я не смогу получить тот же результат, если просто запущу эти команды из файла шаблона.

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

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

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

Спасибо,

~ Andrea

Ответы [ 4 ]

6 голосов
/ 01 марта 2011

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

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

3 голосов
/ 12 октября 2010

Я недавно вновь обратился к этой проблеме.Это можно сделать с помощью 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

0 голосов
/ 29 октября 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), это не будет отражать обновленный gemset, поэтому при вызове system он не выполняется в правильной среде / gemset.Переустановка @env var в новый экземпляр RVM :: Environment устраняет проблему.

0 голосов
/ 28 октября 2010

Андреа, отличный подход и потрясающая блог статья.Однако загрузчик 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 > 

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

Есть какие-нибудь мысли или предложения по поводу этого странного поведения?

...