当外壳环境不存在时,如何使用 RVM 从特定 Ruby 版本运行"bundle exec"



好吧,我得坦白一下——我仍然在运行一个庞大的FCGI设置(只是配置了很多服务器)。我正试着让它适应rvm。在fcgi设置中,我可以指定要执行的命令行命令来运行我的应用程序(Sinatra, Rack, Bundler,整个东西),这就是我在没有rvm

的情况下要做的事情。
"bin-path" => "bundle exec rackup",
"bin-environment" => (
    "RACK_ENV" => "development"
),

假设我的备份文件只是config.ru。现在,在我的Mac上可以这样运行:

"bin-path" => env.HOME + "/.rvm/gems/ruby-1.9.2-p180/bin/bundle exec rackup " + CWD  + "/config.ru",
"bin-environment" => (
    "BUNDLE_GEMFILE" => CWD + "/Gemfile",
    "RACK_ENV" => "development"
),

,但不在服务器上。当调度程序启动时,它们会得到一个精简的环境,其中RVM shell欺骗不再起作用。我想我应该使用包装器选项来制作某种包装器,但我真的不明白这将如何缓解我的问题,以及使用哪些参数。有没有人有在没有加载RVM shell的情况下执行特定ruby和gem二进制文件的经验?

注:为了避免跑题,我不需要Ruby 1.8.7, Passenger或nginx。

您应该能够使用rvm exec:

与大多数rvm set操作一样,exec允许您对所有已安装的ruby执行命令。不像其他的,有一个关键的区别——exec允许你运行任何命令(相对于ruby/gem之类的),如果它只针对单个ruby运行,它在设置环境后执行等同于exec(例如没有错误消息)。

如果rvm可执行文件在$PATH上,你可以这样做:

"bin-path" => "rvm 1.9.2-p180 exec bundle exec rackup"

编辑:原来Jacob是对的,很抱歉有人投了反对票。我决定对这个解决方案进行一些扩展。

我现在可以使用rvm二进制文件,但由于它是用户安装的,所以它不在我笔记本电脑的$PATH上

bigbuk:~ julik$ which rvm
bigbuk:~ julik$ 

但是它在服务器上。

[julik@serveur ~]$ which rvm
/usr/local/rvm/bin/rvm
[julik@serveur ~]$

这就是我困惑的地方。只有它需要用绝对路径调用(因为FCGI运行时没有设置适当的path)。那么应该相应地配置二进制路径,ANDrvm当然也会为我们正确地设置GEM_HOME和GEM_PATH。唯一真正需要设置的是BUNDLE_GEMFILE,因为Bundler不能自动检测FCGI进程的cwd是垃圾。

"bin-path" => "/usr/local/rvm/bin/rvm 1.9.2-p180 exec bundle exec rackup /home/user/websites/behandelaar-web/current/web-root/",
"bin-environment" => (
    "BUNDLE_GEMFILE" => "/home/user/websites/behandelaar-web/current/Gemfile",
    "RACK_ENV" => "production",
 ),

也就是说,使用Ruby编写的特定包装器脚本确实有一些优点,因为rackup和bundle都在冒泡异常方面非常糟糕,如果存在问题的话使用FCGI gem本身(这是我所拥有的-它有1.8特定的字符串字节处理),它的异常将不会通过这个分层的包装器堆栈正确地起泡在错误报告方面,您将看到的最有见地的东西将是来自web服务器的状态500页。

您是否尝试如下设置系统变量:

/etc/environment
BUNDLE_GEMFILE=path_to_the_file
RACK_ENV=production
RUBY_VERSION='ruby-1.9.2-p180'
GEM_PATH='$HOME/rvm/...'

你可以在系统级调整任何rubygems (gem环境)和RVM变量,而不仅仅是用户特定的。

Ok rvm-shell似乎是这个问题的答案,因为它是一个可执行程序,而不是一个shell函数。重要的是,你要自己指定GEM_HOME和GEM_PATH !

        "bin-path" => "/usr/local/rvm/gems/ruby-1.9.2-p180/bin/bundle2 /home/user/websites/behandelaar-web/current/web-root/config.ru",
        "bin-environment" => (
            "BUNDLE_GEMFILE" => "/home/user/websites/behandelaar-web/current/Gemfile",
            "RACK_ENV" => "production",
            "GEM_HOME" =>"/usr/local/rvm/gems/ruby-1.9.2-p180",
            "GEM_PATH" =>"/usr/local/rvm/gems/ruby-1.9.2-p180:/usr/local/rvm/gems/ruby-1.9.2-p180@global",
         ),          ),

"bundle2"脚本是bundle exec和rackup之间的混合,增加了体面的错误报告(因为fcgi没有STDERR和STDOUT,并且链中的许多元素吞下了所有可能导致崩溃的异常)。

#!/usr/local/rvm/rubies/ruby-1.9.2-p180/bin/ruby
#
# Generated Manually!
begin
  require 'rubygems'
  version = ">= 0"
  if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
    version = $1
    ARGV.shift
  end
  gem 'bundler', version
  load Gem.bin_path('bundler', 'bundle', version)
  load Gem.bin_path('rack', 'rackup', version)
rescue Exception => e
  File.open("/tmp/fcgrun-crash.log", "w") do | f |
    f.puts(ENV.inspect)
    f.puts(e.class.to_s)
    f.puts(e.message)
    f.puts(e.backtrace.join("n"))
  end
  # and raise further
  raise e
end

相关内容

  • 没有找到相关文章

最新更新