前言
在学习rails和写ruby程序的过程中,相信ruby的包管理都困扰过不少初学者,实在是由于包管理有点混乱,大批的 rails初学者被挡在了rails环境配置和包管理上面,gem是ruby包管理器,有了它省心不少。在ruby1.9以前的版本, 在ruby程序中需要通过require "rubygems"来引入安装的gem包,1.9以后的版本内嵌了rubygems,通过gem安装的ruby 包可以直接应用。
gem
拿ruby1.9.3为例,gem安装的包会在[ruby_dir]/lib/ruby/gems/1.9.1/gems目录下面,这是经过解压后的lib包, 原生态的gem包会被放在[ruby_dir]/lib/ruby/gems/1.9.1/cache目录下面,了解了其目录结构我们就可以很方便 地去手动控制gem包管理。下面我们进去gem命令吧:
- gem install gemname 从源rubygems.org安装gem包
- gem install -l gemname.gem 从本地安装gem包,ruby会到上面的cache目录下搜索
- gem install gemname --version=[ver] 安装指定版本的gem包,对于版本控制这个命令必不可少
- gem update [gemname] 更新所有或个别gem包,它不会去更新版本
- gem list --[remote|local] [gemname] 列出远程和本地所有与gemname匹配的gem包
- gem uninstall gemname [--version=[ver]] 卸载gem包,如果不指定版本,将会卸载所有版本
通过gem可以很容易地控制安装的gem包和管理gem的版本,因为gem可以说是ruby的重要部分,无论是通过手动还是 gem命令去管理gem包,都是不可或缺的。
bundle
bundle是一款管理gem依赖的软件,它只能在包含Gemfile的目录下运行,bundle命令会根据Gemfile文件里的包信息 去管理gem包。先来看一下Gemfile:
source 'http://rubygems.org'
是上文中的gem远程库,如果你以为这个库太慢可以将它替换成:
source 'http://ruby.taobao.org'
gem "rails", "3.2.2"
表示安装的rails版本为3.2.2
gem "rails", ">=3.2.2"
安装的rails版本要大于等于3.2.2,不满足bundle会报错
gem "rails", "~>3.2.2"
安装的rails版本不大于3.2.2
gem "sqlite3-ruby", "1.2.5", :require => "sqlite3"
项目中的gem更名操作,实际的包名是sqlite3,在
项目中使用需要通过bundle.require来引入。
gem "json", "1.5.5" :git=>
可以通过git来安装gem包
gem "gemname", "version" :path=>
本地路径来安装gem包
要使用bundle需要gem install bundler
来安装,它常用的命令如下:
- bundle install 通过Gemfile来安装gem包
- bundle update 更新Gemfile中的gem包,它会升级版本号,慎用
- bundle check 检查系统中缺少的gem包
- bundle show gem_name 可以查看这个gem的目录位置
- bundle open gem_name 可以用编辑器打开这个gem的目录
通过bundle install安装好相应版本后会自动生成一个gemfile.lock,将版本号锁死,方便管理。
git
git无疑是当下最流行的开发版本控制工具,如果你们是一个团队来协作开发,需要各个版本的合并与丢弃,那么 git无疑是最合适的选择。我们从如何创建git库开始,让你快速地学会使用git:
- ubuntu下面sudo apt-get install git来安装git
- git init 将已经存在的文件夹初始化为一个本地git仓库
当然你可以直接clone远程已经存在的git仓库:
- git clone https://github.com/zhing/zhing.github.com.git,这种方式是通过http来克隆git仓库,当然 也可以通过ssh来进行。
- git config --global user.name "zhing" 设置你的全局用户名,当然也可以指定email等属性
当需要提交某些改动时:
- git add <filename|dirname>
- git commit -m "改动说明"
此时已将你的改动提交到了.git中的HEAD里,但是并没有提交到远程库
当需要将改动推送到远程仓库时,需要如下做:
- git remote set-url https://github.com/zhing/zhing.github.com.git 如果你的本地仓库还没有和远程 仓库关联起来,这条指令会帮住你
- git push origin master 即将改动提交到远程仓库的master分支中
如果你需要删除某些文件和文件夹,只需将上文中的add改成rm,加上-r表示递归地删除,然后执行上述三个动作 就可以在本地和远程库中删除某些文件
下面我们来说git真正功能强大的表现分支branch:
- git branch branchname 创建一个本地分支
- git checkout branchname 切换到branchname这个分支中
- git branch -d branchname 将branch分支删除,这时你需要切换到其他的分支中
- git push origin branchname 将你的本地分支推送到远程仓库中
上面说明了怎么创建分支,这样你就可以在分支中开发自己的代码了,各个分支中的代码并不会互相干扰,我们 建议不要再主分支master上开发。
如果需要分支和更新和合并,如下:
- git pull 将远程库中的代码更新至你的本地库
- git fetch 从一个远程仓库中下载代码,当然对于git pull 与 fetch,你可以给他们指定关连的远程库
- git reset --head origin branchname 可以帮助改变你的当前本地分支和远程分支的关联
- git merge branchname 将分支branchname与当前分支合并,当然不是都能成功,有时候需要你去手动修改 一些conflicts
这些内容让你进行一般的git开发已经够用了,如果你想更深入,可以去弄清楚.git里面的HEAD,分支提交和合并 的奥秘都在那里面。