RubyGem的基本原理&Rails安装failed原因分析

本文介绍了Ruby语言的特点及其发展历程,并深入探讨了Gem作为Ruby程序包管理工具的功能与使用方法,包括安装Rails框架过程中遇到的问题及解决办法。

其实本人并没有机会使用ruby,现在没有今后也不太可能会有,知晓ruby仅仅是因为研究PHP web framework的时候无意间听人提起的rails框架,rails框架使用ruby开发,据说性能卓越,关于这一点我并没有切身的体会,因为我只完成了框架的安装步骤并没有使用过,安装rails的过程就会用到gem工具。

接受gem这种工具的存在对我来说挺曲折的,首先我并没有使用过ruby,只花了一天的时间看完了一本ruby入门的书籍,记住了些许ruby独特的构词和语法,的确和python风格类似,但是python可没有所谓的包管理工具(package management tool),python和perl都有自己的lib文件,通常打包成压缩文件的格式在网络上存储,解压到系统任意位置就可以在自己的code里使用文件路径调用,python还有包的概念,perl则是更传统跟c一样的风格,所以很长一段时间我一直认为gem工具就是Ruby的类库下载更新工具,这就进入一个误区,导致我一直困惑为什么gem下载类库还在在本地build native exitension,后来联想到rails框架就是一个成熟的ruby产品而不是所谓的类库后才幡然醒悟gem就是一款ruby官方推动的ruby程序包管理工具,开发者可以通过gem发布其ruby程序,用户则通过gem实现ruby程序的自动化下载更新。

Ruby

关于ruby语言本身就不在这里详细解释了,脚本程序语言的一种,我学习脚本语言的轨迹是Shell -> Perl -> Python -> Ruby,如果今后没有特别的境遇,我对ruby的认知程度很可能就止步于此,上述的轨迹也可以说是脚本语言的发展轨迹,从早期的shell到觉得shell不好用于是自己开发并大受欢迎的perl(当然还有从perl演化出来的PHP),在到更多体现的是面向对象理念的python和ruby,python还比较中庸,也支持纯粹的函数式编程,ruby则跟java一样完全的面向对象,虽然各个语言的数据结构,逻辑控制的概念和实现机制并不相同,但体现出的思想内涵则是类似的,形式越来越多的变量结构,越来越灵活的操作符和语法,所以确实,只要能熟练掌握一门编程语言,学习其他的编程语言就会变得很简单。

Gem (Official Site:https://rubygems.org)

本质上来讲gem是一款官方提供的ruby软件包发布管理工具,而且该工具也是通过ruby写成的,类似于redhat的yum和debian的apt-get,不同的是上述两种工具在系统级别管理软件包,而gem只用来安装更新ruby程序。

不同包管理工具的功能和机制大同小异,但大体都是远端(remote)架设软件源(source),包管理工具可以实现远端搜索(search)软件包;本地(local)列举(list)已安装的软件包以及查看软件包安装信息(files);从远端下载(download)安装(install)升级(upgrade)软件包;卸载(uninstall)已安装的软件包。

RubyGem的UserGuide: http://guides.rubygems.org/
由于官方的软件源国内访问较慢,当然大多数的时候访问不到,因此可以可以Ruby China的镜像源:http://gems.ruby-china.org

Gem Command

<!-- display sub command help -->
gem help <sub_command>

<!-- software source operation -->
gem source -l (list); gem sources -a https://gems.ruby-china.org/ -r https://rubygems.org/ (source change); git source -u (update)

<!-- update gem itself -->
gem update --system (update gem self)

<!-- update gems installed -->
gem update (update gems)

<!-- search gems from local/remote -->
gem search <item> -b (both)/-l(local)/-r(remote, default) | -d (detailed) -a (version list)

<!-- install/uninstall gems -->
gem install <item> -V (verbose); gem uninstall <item>

<!-- list gems in local/remote -->
gem list  -b (both)/-l(local)/-r(remote, default) | -d (detailed) -a (version list)

<!-- files list in gems installed  -->
gem contents <item> (files list)

<!-- can browse gems installed information by browser -->
gem server (web page to show gems installed)

<!-- display env -->
gem environment (env list)

系统<Ruby_root>/ruby/gems//文件夹下一般会有以下四个文件cache doc gems specification extensions, 其中cache文件夹下存放下载的原生gem包,gems文件夹下存放unpack后的gem,extensions文件夹下存放ruby程序所需要的library文件,一般是通过ruby wrapper封装系统函数生成的,通常系统缺少dev包或者系统lib文件会导致compile extension失败,进而导致gem安装程序失败。

Rails Install

在基础知识储备完毕之后通过gem开始安装rails框架,系统为64位Ubuntu,敲入gem install rails -V出现下面的failed info:

root@bruce-virtual-machine:/var/lib/gems/2.3.0/gems# gem install rails
Building native extensions.  This could take a while...
ERROR:  Error installing rails:
 ERROR: Failed to build gem native extension.

    current directory: /var/lib/gems/2.3.0/gems/nokogiri-1.7.1/ext/nokogiri
/usr/bin/ruby2.3 -r ./siteconf20170326-37653-qf8a6z.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /var/lib/gems/2.3.0/gems/nokogiri-1.7.1 for inspection.
Results logged to /var/lib/gems/2.3.0/extensions/x86_64-linux/2.3.0/nokogiri-1.7.1/gem_make.out

通过log可见failed的原因在于compile extension时找不到ruby的头文件,使用apt-get install ruby2.3-dev安装ruby的dev包,安装完成后该步骤pass,但接着出现以下错误:

Building native extensions.  This could take a while...
current directory: /var/lib/gems/2.3.0/gems/nokogiri-1.7.1/ext/nokogiri
/usr/bin/ruby2.3 -r ./siteconf20170326-38096-5jvcih.rb extconf.rb
checking if the C compiler accepts ... yes
Building nokogiri using packaged libraries.
Using mini_portile version 2.1.0
checking for gzdopen() in -lz... no
zlib is missing; necessary for building libxml2
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

通过log可以定位到问题出在zlib这个lib包上,list系统安装的软件包,发现该lib包已经安装,但是对应的开发包没有安装,使用命令apt-get install zlib1g-dev安装之后,在无报错,rails成功安装。

root@bruce-virtual-machine:~# rails -v
Rails 5.0.2

关于ruby/gem的extension可以参考官方资料

Creating Extension Libraries for Ruby https://docs.ruby-lang.org/en/2.4.0/extension_rdoc.html
Gems with extensions http://guides.rubygems.org/gems-with-extensions/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值