IT,  Rails,  Ruby

bundler 简述

bundler 优点:节省项目的gem搭建, 能隔离每个项目的环境

例子:

之前没有bundle时, 你要运行一个rails项目你需要将所有的项目需要的gem一个一个的进行gem install xxx, 你能忍…

环境隔离就更好理解了, 比如你在维护一个项目A, 比如A项目中的foo gem的版本为2.0, 后来你又新增了一个维护项目B, B中的foo gem version 为 3.0 这时当你启动项目A时,你会发现项目A启动不起来了,因为你在运行项目 A 时,gem 默认会去找多个版本中最新的版本,于是在项目 A 中你用到了 3.0 版本的 foo 而不是 2.0 版本。

这时,bundler就出来了, bundle提供了两个命令 bundle installbundle exec

bundle install 会将你项目的gem list (gemfile)里面的gem 依次去安装,并将当前项目需要的所有gem的版本号都写入到 Gemfile.lock 文件中。保证不同时刻不同机器执行 bundle install 能够安装同样版本的 gem。

bundle exec 则解决了多个项目的gem版本不隔离的情况。当你执行 bundle exec 的时候,bundler 会把 $LOAD_PATH 中不相干的那些 gem 的路径全都去掉,然后读取 Gemfile.lock 中的 gem 版本。保证 $LOAD_PATH 中只存在 Gemfile.lock 中已经固定版本的 gem 的路径。

bundler 带来的问题(其实并不算问题):

bundler 可以很好的解决项目的gem环境隔离的问题,但是我们每次在项目里执行的时候都要加上bundle exec  的前缀😫 😫 😫是不是感觉很麻烦。

还好有rubygems-bundler (Gem)可以解决这个问题,你可以执行 gem install rubygems-bundler  下载这个Gem,下载完成后只要执行一次 gem regenerate_binstubs , rubygems-Bundler 就会帮你在任何 gem 安装的命令行执行之前检查一下当前目录以及父目录是否存在 Gemfile。如果存在,就自动帮你的命令行之前加上 bundle exec 再执行。完美的解决了这个问题。

小提示:1.11.0 以上版本的 RVM 在安装 Ruby 时,会默认安装 rubygems-bundler。你可以通过 gem list rubygems-bundler 来检查自己是否安装了这个 gem。当然你如果用 homebrew 安装 Ruby,则不会享受到这个隐藏的福利。

修仙的码农...

发表评论

电子邮件地址不会被公开。 必填项已用*标注