首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将我的JSON扩展链接到正确的Ruby版本?

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

Stack Overflow用户
提问于 2015-07-14 13:17:07
回答 2查看 141关注 0票数 2

如果我安装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服务器总是分段错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-30 20:59:38

听起来你在处理一个典型的依赖-地狱问题。

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

安装以下工具:

然后按照各自的家庭指令。

现在安装您喜欢的Ruby:

代码语言:javascript
复制
ruby-install ruby 2.2.2

导航到您的项目目录:

代码语言:javascript
复制
cd ~/projects/operation-snugglepants

切换到您喜欢的Ruby:

代码语言:javascript
复制
chruby 2.2.2

然后确保您没有被系统Ruby抢先:

代码语言:javascript
复制
which ruby

应该给你一条路

代码语言:javascript
复制
~/.rubies/ruby-2.2.2/bin/ruby

并验证这是正确的版本:

代码语言:javascript
复制
ruby -v
ruby 2.2.2p95 ...

太好了--现在你得到了正确的Ruby。让我们确保你有正确的宝石。将gem安装目标设置为项目的目录:

代码语言:javascript
复制
gem_home .

并安装bundler:

代码语言:javascript
复制
gem install bundler

然后安装你的宝石:

代码语言:javascript
复制
bundle install

在完成之后,现在bundle rails server并验证它是否正常运行:

代码语言:javascript
复制
bundle exec rails server
=> Booting WEBrick
=> Rails 4.2.0 application starting in development on http://localhost:3000

始终确保您已经将系统依赖项(system和system )与应用程序依赖项(应用程序Ruby和应用程序宝石)隔离开来。如果可能的话,千万不要把两者混为一谈。

我还使用了一个短Bash脚本,它在我的shell启动时加载一些别名,“跳转”到我的Ruby项目特定的环境中,让事情更容易使用

票数 1
EN

Stack Overflow用户

发布于 2015-07-31 13:05:10

什么起作用了

约翰·费米内拉的回答帮我解决了这个问题,但我想详细说明一下我做了什么。

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

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

因此,我按照John的指示,在项目文件夹中运行了gem_home .,然后使用这个Ruby脚本卸载了所有能够安装的gem:

代码语言:javascript
复制
`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重命名为一个版本,例如,~/.gem/ruby/2.2.0改为2.2.0_inactive)
  • cd my_projectchruby 2.2.0
  • bundle install # =>错误,没有这样的gem
  • gem install bundler #=>工作得很好
  • which bundle # => OH,是
  • bundle install #这将创建悲伤。

为什么?由于这个Ruby还没有宝石,所以which bundle指出了/usr/bin/bundle --这是system附带的一个。bundle install编译代码的任何宝石在尝试使用不同的Ruby时都可能导致分段错误。

相反,如果在运行bundle install之前,i chruby 2.2.2which bundle~/.gem/ruby/2.1.2/bin/bundle提供了它应该做的事情,那么bundle install可以正常工作。

这里是我为防止将来发生这种情况所做的事情:在/usr/bin/bundle上编辑Ruby到puts,一个警告和exit。对于/usr/bin/bundler/usr/bin/rails来说,也是一样的,因为这是好的衡量标准。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31407780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档