如果我安装Ruby2.1.6(或2.2.2等)并尝试require 'json',我会得到一个分段错误。我报道称并被告知“您的json扩展链接到ruby2.0.0,而不是ruby2.1.6。”
我用ruby-install安装了我的Ruby版本,我不太了解编译Ruby的细节。
如何让这个扩展链接到正确版本的Ruby?
澄清
这是一个关于编译Ruby可执行文件的C源代码的问题。它需要C知识来回答,而不仅仅是Ruby知识;这就是我用两种语言标记它的原因。
我真正的目标是能够使用最新的rails server版本(目前为2.2.2)来。执行require 'json'有时会触发分段错误,但rails s总是这样做。
更新
我在找人陪我解决这个问题。
我尝试将整个~/.rubies文件夹移动到~/.old_rubies,然后从头开始执行ruby-install ruby 2.2.2。我尝试过卸载每个JSON创业板,它会让我(尽管它不会让我删除默认的创业板)。有时irb; require 'json'可以工作,但是启动rails服务器总是分段错误。
发布于 2015-07-30 20:59:38
听起来你在处理一个典型的依赖-地狱问题。
首先要做的是:我们需要隔离你的环境。我们不希望您的操作系统安装Ruby或它的宝石干扰您的项目安装Ruby。
安装以下工具:
ruby-install:https://github.com/postmodern/ruby-installchruby:https://github.com/postmodern/chrubygem_home:首页然后按照各自的家庭指令。
现在安装您喜欢的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始终确保您已经将系统依赖项(system和system )与应用程序依赖项(应用程序Ruby和应用程序宝石)隔离开来。如果可能的话,千万不要把两者混为一谈。
我还使用了一个短Bash脚本,它在我的shell启动时加载一些别名,“跳转”到我的Ruby项目特定的环境中,让事情更容易使用
发布于 2015-07-31 13:05:10
什么起作用了
约翰·费米内拉的回答帮我解决了这个问题,但我想详细说明一下我做了什么。
首先,我卸载了每个版本的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.0bundle install # =>错误,没有这样的gemgem install bundler #=>工作得很好which bundle # => OH,是bundle install #这将创建悲伤。为什么?由于这个Ruby还没有宝石,所以which bundle指出了/usr/bin/bundle --这是system附带的一个。bundle install编译代码的任何宝石在尝试使用不同的Ruby时都可能导致分段错误。
相反,如果在运行bundle install之前,i chruby 2.2.2,which bundle给~/.gem/ruby/2.1.2/bin/bundle提供了它应该做的事情,那么bundle install可以正常工作。
这里是我为防止将来发生这种情况所做的事情:在/usr/bin/bundle上编辑Ruby到puts,一个警告和exit。对于/usr/bin/bundler和/usr/bin/rails来说,也是一样的,因为这是好的衡量标准。
https://stackoverflow.com/questions/31407780
复制相似问题