【问题标题】:Call Ruby 1.8 script from Ruby 2.0 script从 Ruby 2.0 脚本调用 Ruby 1.8 脚本
【发布时间】:2013-12-03 15:22:13
【问题描述】:

我不确定这是属于这里还是其他地方(超级用户?),但无论如何:

我有两个 Ruby 脚本,一个需要 Ruby 2.0 (A),另一个需要 1.8 (B)。 A 需要使用分叉的进程调用 B。 A 是这样的:

require "fileutils"
require "json"

...

`name_of_B`

B 是一个带有 shebang 的可执行脚本,开头如下:

#!/Users/user_name/.rvm/rubies/ruby-1.8.7-p374/bin/ruby
require 'rubygems'
require 'json'

...

我使用RVM 来管理我的 Ruby 版本:

> rvm list
rvm rubies

   ruby-1.8.7-p374 [ i686 ]
   ruby-1.9.3-p448 [ x86_64 ]
=* ruby-2.0.0-p247 [ x86_64 ]

我运行 A:

> ruby name_of_A

但最终得到:

/Users/jacobevelyn/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext/parser.bundle: [BUG] Segmentation fault
ruby 1.8.7 (2013-06-27 patchlevel 374) [i686-darwin12.5.0]

对我能做什么有什么想法吗?我不太了解 gems,但似乎 B 试图查看安装在 Ruby 2.0 下而不是 1.8 下的 gems。 (是的,我已经在 1.8 下运行了 gem install json。)显然脚本比这里显示的要复杂,绝对不能移植或组合(这并不意味着我不想要到,这意味着我不能为我的用例),否则我会。

【问题讨论】:

    标签: ruby gem rvm ruby-2.0 ruby-1.8


    【解决方案1】:

    您需要将 shebang 更改为:

    #!/Users/user_name/.rvm/wrappers/ruby-1.8.7-p374/ruby
    

    它不仅会使用红宝石,还会使用它的宝石。

    如果您使用捆绑器(Gemfile),您可能还需要将命令调用包装在:

    Bundler.with_clean_env do
      ...
    end
    

    这将重置加载的捆绑器环境

    【讨论】:

    • 这里的 shebang 似乎不太正常,但如果 A 用 /Users/user_name/.rvm/wrappers/ruby-1.8.7-p374/ruby name_of_B 调用 B 就可以了。奇怪。
    【解决方案2】:

    呼叫:

    result = `\path\to\ruby_1_8 \path\to\ruby_1_8_script.rb`
    

    这将使用正确的 ruby​​ 二进制文件来执行需要它的脚本。结果保存到变量中。


    您可以致电which ruby 来查找您当前目录中的 ruby​​ 版本。转到您的项目/源目录并调用它以查看您用于主应用程序的版本(可能是 Ruby 2)。然后,转到您的旧项目/repo(与 1.8 脚本相关联)并再次运行它。希望这将向您展示通往 Ruby 1.8 的道路。如果没有,请从根目录 (/) 尝试。或者使用 RVM 自信地切换到 Ruby 1.8,然后在那里调用它以获取路径。


    我很少使用 RVM。如果它感到困惑,并通过错误的 gem 集等进行过滤,那么您可能需要切换到 rbenv。此外,您可能需要使用它自己的函数来显示 Ruby 1.8 二进制文件的真实路径(即,它可能与 which 混淆?)同样,我不使用 RVM。

    【讨论】:

    • 不幸的是,这仍然不起作用。我正在运行 /Users/user_name/.rvm/rubies/ruby-1.8.7-p374/bin/ruby name_of_B 并遇到同样的错误。我试过rvm use 1.8 ; name_of_B ; rvm use 2.0,但后来我得到:“RVM 不是一个函数,用'rvm use ...'选择红宝石是行不通的。”然后再次出现段错误。
    • 该命令是否在 Ruby 2.0 之外工作?就像你从命令行调用它一样?
    • RVM 不能在 Ruby 2.0 中工作,因为 RVM 是通过你的 shell 启动脚本加载的。您可以尝试获取该文件 (.bashrc?) 但我以前从未这样做过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2013-07-29
    相关资源
    最近更新 更多