如果我安装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服务器总是会出现段错误。
答案 0 :(得分:1)
听起来你正在处理经典的依赖地狱问题。
首先要做的事情是:我们需要隔离您的环境。我们不希望您的操作系统安装的Ruby或其宝石干扰项目安装的Ruby。
安装这些工具:
ruby-install
:https://github.com/postmodern/ruby-install chruby
:https://github.com/postmodern/chruby gem_home
:https://github.com/postmodern/gem_home 并按照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
我想我已经能够找到根本原因。我可以像这样再次获得段错误:
~/.gem/ruby/2.2.0
改为2.2.0_inactive
)cd my_project
和chruby 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.2
,which bundle
提供了~/.gem/ruby/2.1.2/bin/bundle
,并且bundle install
正常工作。
以下是我为防止将来做的事情:在/usr/bin/bundle
编辑Ruby脚本并向puts
发出警告并{{ 1}}。同样适用于exit
和/usr/bin/bundler
。