Ubuntu16.04下Ruby2.3.1+Rails5.1.4的gem扩展未构建及json安装报错问题
解决Ubuntu 16.04下Ruby 2.3.1 + Rails 5.1.4的gem扩展构建与json安装失败问题
嘿,我来帮你搞定Ubuntu 16.04上装Ruby 2.3.1和Rails 5.1.4时碰到的这些gem问题——不管是nokogiri、bindex这类扩展没构建的提示,还是后来json 1.8.6装失败的报错,本质都是系统依赖缺失或者gem缓存损坏导致的,一步步来解决:
一、先搞定那些“扩展未构建”的gem
系统提示的gem pristine [gem名] --version [版本号]确实是修复缓存损坏gem的好办法,但先别急着执行,得先把Ubuntu上编译Ruby扩展需要的基础依赖装上,不然还是会失败:
- 安装基础编译工具和Ruby开发依赖:
sudo apt-get update sudo apt-get install build-essential patch ruby-dev zlib1g-dev liblzma-dev
- 针对nokogiri,它还需要额外的XML处理依赖,得单独装:
sudo apt-get install libxml2-dev libxslt1-dev
- 现在再逐个修复提示的gem,比如:
gem pristine nokogiri --version 1.8.1 gem pristine bindex --version 0.5.0
要是记不全所有报错的gem也没关系,先处理下面的json问题,后面bundle install时再针对性修复就行。
二、解决json 1.8.6安装失败的核心问题
json 1.8.6在Ruby 2.3.x和Ubuntu 16.04上装失败,大多是因为高版本gcc的编译规则和旧版json源码不兼容,加上可能缺了依赖,按下面步骤来:
- 先装json需要的数学库依赖:
sudo apt-get install libgmp-dev
- 用指定编译参数安装json 1.8.6,跳过gcc的隐式函数声明错误:
gem install json -v '1.8.6' -- --with-cflags="-Wno-error=implicit-function-declaration"
这个--with-cflags参数很关键,因为Ubuntu 16.04的gcc会把某些旧代码里的隐式函数声明当成错误,而json 1.8.6的源码没适配这个规则,加上这个参数就能绕过去。
- 装完json后,回到你的Rails应用目录,重新跑:
bundle install
三、额外的小提醒
- 如果你用rvm或者rbenv管理Ruby版本,先确认当前shell加载的是Ruby 2.3.1(输
ruby -v看看版本对不对),别搞错环境了。 - 要是还是装不上,试试清掉gem缓存再重新来:
gem cleanup rm -rf ~/.gem/ruby/2.3.1/cache/json-1.8.6.gem
然后再重新执行安装json的命令。
内容的提问来源于stack exchange,提问作者Dhinakaran
相关产品推荐
相关产品推荐

