其实本人并没有机会使用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/
本文介绍了Ruby语言的特点及其发展历程,并深入探讨了Gem作为Ruby程序包管理工具的功能与使用方法,包括安装Rails框架过程中遇到的问题及解决办法。
4548

被折叠的 条评论
为什么被折叠?



