如何将我的JSON扩展链接到正确的Ruby版本?

时间:2015-07-14 13:17:07

标签: c ruby

如果我安装Ruby 2.1.6(或2.2.2等)并尝试require 'json',我会遇到段错误。我reported this并被告知“你的json扩展名与ruby 2.0.0相关联,而不是ruby 2.1.6。”

我用ruby-install安装我的Ruby版本,我真的不了解编译Ruby的细节。

如何才能将此扩展程序链接到正确的Ruby版本?

澄清

这是关于编译Ruby可执行文件的C源代码的问题。它需要C知识来回答,而不仅仅是Ruby知识;这就是为什么我用两种语言标记它。

我的真正目标是能够rails server使用最新的Ruby版本(目前为2.2.2)。执行require 'json'有时会触发段错误,但rails s始终会这样做。

更新

我正在找人帮我解决并解决这个问题。

我已尝试将整个~/.rubies文件夹移至~/.old_rubies并从头开始ruby-install ruby 2.2.2。我已经尝试卸载它会让我的每个JSON gem(尽管它不会让我删除默认的gem)。有时irb; require 'json'可以工作,但启动rails服务器总是会出现段错误。

2 个答案:

答案 0 :(得分:1)

听起来你正在处理经典的依赖地狱问题。

首先要做的事情是:我们需要隔离您的环境。我们不希望您的操作系统安装的Ruby或其宝石干扰项目安装的Ruby。

安装这些工具:

并按照Homebrew的说明进行操作。

现在安装您喜欢的Ruby:

ruby-install ruby 2.2.2

导航到您的项目目录:

cd ~/projects/operation-snugglepants

切换到您首选的Ruby:

chruby 2.2.2

然后确保您不被系统Ruby抢占:

which ruby

应该给你一个像

这样的路径
~/.rubies/ruby-2.2.2/bin/ruby

并确认它是正确的版本:

ruby -v
ruby 2.2.2p95 ...

太棒了 - 现在你已经拥有了正确的Ruby。让我们确保您拥有合适的宝石。将gem安装目标设置为项目的目录:

gem_home .

并安装bundler:

gem install bundler

然后安装你的宝石:

bundle install

完成后,现在bundle rails server并验证它是否正常工作:

bundle exec rails server
=> Booting WEBrick
=> Rails 4.2.0 application starting in development on http://localhost:3000

始终确保您已从应用程序依赖项(应用程序Ruby和应用程序gem)中隔离了系统依赖项(系统Ruby和系统gem)。如果可能的话,千万不要混合两者。

我还使用short Bash script在我的shell启动时加载一些别名来跳转"跳转"进入我的Ruby项目特定的环境,让事情更容易使用 - 随意刷它!

答案 1 :(得分:0)

什么有用

John Feminella's answer帮助我解决了问题,但我想详细说明一下我做了什么。

首先,我卸载了json gem的每个版本,除了默认版本并安装了更新的版本。下次我运行rails s时,我发现在尝试要求nokogiri时发生了段错误。我想,"也许它是带有C扩展名的任何宝石?"

我的猜测是他们都需要重新编译,但是bundle install$GEM_PATH的其他地方找到了旧版本,因此没有在$GEM_HOME中安装/重新编译新版本。

所以我遵循了John的指示,达到了我在项目文件夹中并运行gem_home .的程度,然后卸载了我可以使用这个Ruby脚本的每个gem:

`gem list --no-versions`.split("\n").each do |gem|
  `gem list -d #{gem}`.gsub(/Installed at(.*):.*/).each do |dir|
    dir = dir.gsub(/Installed at(.*): /,'').gsub("\n", '')
    system "gem uninstall #{gem} -aIx -i #{dir}"
  end  
end

之后,我运行bundle install,因为我已完成gem_home .,所以将新版本放入my_project_folder/.gem/ruby/2.2.2

然后,当我跑rails s时,它没有发生过段错误!

总之, YAAAAAAY !!! :D

更新:我认为我发现了根本原因

我想我已经能够找到根本原因。我可以像这样再次获得段错误:

  • 安装新版本的Ruby(或将某个版本的gem dir重命名,例如~/.gem/ruby/2.2.0改为2.2.0_inactive
  • cd my_projectchruby 2.2.0
  • bundle install#=>错误,没有这样的宝石
  • gem install bundler#=>工作得很好
  • which bundle#=> OH什么,/usr/bin/bundle
  • bundle install这会造成悲伤

为什么呢?由于此Ruby尚无宝石,which bundle指向/usr/bin/bundle - 系统Ruby附带的宝石。 bundle install编译代码的任何宝石在尝试使用不同的Ruby版本时都可能导致段错误。

相反,如果在运行bundle install之前,我chruby 2.2.2which bundle提供了~/.gem/ruby/2.1.2/bin/bundle,并且bundle install正常工作。

以下是我为防止将来做的事情:在/usr/bin/bundle编辑Ruby脚本并向puts发出警告并{{ 1}}。同样适用于exit/usr/bin/bundler