Java
程序员学Ruby--从折腾开始
这篇文章信息含量不高,基本上
理解为吐槽+备忘就对了。
最近想自己做一点东西,但是实在厌倦了
J2EE世界里数不清的xml,也在寻求一种“高效的开发语言”。基本上说到高效和
敏捷,大家都在推崇Ruby on Rails,所以抽周末的空来尝个鲜。
学新语言,我一般喜欢先配置环境,弄几个短的snippet来看看,熟悉语法。于是就需要先配置环境。
Ruby本身的安装还算简单,下载一个rvm,然后安装就可以了。安装后ruby本身的包和gems都会放在/opt/local/lib/ruby下。但是当我下载了一个Rails的app Rabel,尝试部署并启动时,噩梦就开始了。
gem是Ruby包管理的一个工具,跟
Maven类似。但是Java崇尚Compile Once,Run anywhere,所有的依赖管理都管理具体项目。而gem则是管理本地运行环境的,使用gem install gem_name可以将包安装到本地。这样虽然运行具体项目会痛苦一点,却也极大避免了多个项目的依赖冲突问题。
脚本语言都有个功能:本地扩展(Native Extension),跟Java里的JNI是一个意思。不过Java世界都崇尚pure Java,基本上依赖管理都是在jar包之间,完全是Maven可以搞定的。而脚本语言一般都秉承了UNIX世界的多模块混合的思想,经常使用本地扩展,例如xml
解析,就使用libxml。安装本地库,就不是gem能搞定的事了。
在mac下,最好安装一个port或者brew,不然得自己去make install之类的,很麻烦。port更加强大一些,但是会傻乎乎的下载重复的依赖。例如我要下载一个mysql-ruby的库,它会先下载mysql、再下载ruby,最后再下载这个库,而其实我只需要一个ruby扩展而已。当然port下载一些C语言的库是很有用的,如sqlite3、libxml之类,省去了编译和查找依赖的过程,这个过程对于Java程序员来说真是太痛苦了。
在尝试使用rails server启动Rabel时,提示找不到nokogiri。使用gem install nokogiri安装之,
发现缺少libxml依赖。后来使用port安装libxml之后,依然找不到。最后升级ruby
版本之后,问题解决了。
gems安装
比较好的地方是,即使没有安装成功,它也会将临时文件保存在/opt/local/lib/ruby/gems/1.8/gems/gem_name目录下,供分析用。
ruby 的 gems 很普及,为什么 java 的 maven 用的不是很普及呢?
ruby的gems已经是集成到sdk里了,maven没有等同的地位。
这种境况是由于java在maven出现以前就有完备的包管理机制(
classloader,package),开源社区也普遍遵循命名规则,没有依赖管理也不至于很惨。
ruby就不行了,用的还是很原始的include模式,没有gems世界会乱套的。
rubyer是不得不用gems,javaer是可用可不用,或者用ant、ivy、grape、buildr都行。当然得承认maven的复杂度比 gem要高许多(依赖管理只是maven要解决的一小部分问题,它着眼于整个项目过程),实施过程遇到的问题也会更多,所以maven的推行是一个很
漫长的过程。