4

Rails 3 テンプレートを使用して RVM gemset をセットアップしようとしています。次に、テンプレートのコマンドを使用して、gemset の使用を開始し、gem を新しい gemset (アプリにちなんで名付けられた) にインストールします。これは正しく動作していないようです。新しい gem は gemset にインストールされず、実際、gemset はまったく作成されません。

テンプレート ファイルから抽出された関連コードの一部を次に示します。

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

そして 3 番目のバージョン:

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

テンプレートが実行された、コンソールの新しいアプリ フォルダーに cd するだけで完全に機能します。次の RVM メッセージが表示されます。「info: Now using gemset 'test_app'.」その時点で bundle install コマンドを実行すると、gem は新しい gemset に正しくインストールされますが、これらのコマンドをテンプレート ファイルから実行しただけでは同じ結果が得られません。

アプリジェネレーターのログには次のように書かれています:

 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を使用しています。

ありがとう、

〜アンドレア

4

4 に答える 4

6

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

これにより、現在選択されている ruby​​ が検出され、その名前の gemset が作成され、bundler がインストールされます。最後に、Gemfile で指定された gem をインストールし、.rvmrc ファイルを作成します。

私の github リポジトリhttps://github.com/andyh/Templateにテンプレート全体が表示されます

于 2011-03-01T16:42:00.237 に答える
3

私は最近、この問題を再検討しました。これは、RVMRubyAPIを使用して実行できます。次のように、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}")

興味のある方は、Rails3テンプレート全般に関するブログ投稿を作成しました。これについて詳しく説明します。

カスタムレール3テンプレートの作成

于 2010-10-12T00:25:17.190 に答える
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")

動作します。

rvmには、gemset_useを使用して@rvm_environmentインスタンス変数が正しく設定されないというバグがあります。したがって、@ env.send(:instance_variable_get、:@ rvm_environment)を実行すると、更新されたgemsetが反映されないため、システムを呼び出すと、適切な環境/gemsetで実行されません。@env変数を新しいRVM::Environmentインスタンスに再設定すると、問題が修正されます。

于 2010-10-29T01:30:20.443 に答える
0

アンドレア、優れたアプローチとすばらしいブログ記事。ただし、RVM ブートストラップは機能しません。

以下は、irb で新しい 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 > 

最後の行は現在の gemset を読み込もうとしていることに注意してください。これは nil です (端末セッションはデフォルトの gemset を使用していたため、空です)。「some_gemset」が表示されると思っていました。スクリプトを実行すると、基本的に同じ動作が得られます。スクリプトを実行したときにたまたま含まれていたジェムセットにジェムがインストールされます。

この奇妙な振る舞いについて何か考えや提案はありますか?

于 2010-10-28T11:25:28.413 に答える