20--Bundle与Gemfile
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20--Bundle与Gemfile相关的知识,希望对你有一定的参考价值。
这节课我们讲解Bundle的构建和Gemfile的使用方法。之前我们只是两句话代码,这节课我们进一步来讲解:
什么事bundler?
是rails应用程序中对gem依赖包进行管理的一种管理工具。它会根据Gemfile中的设置自动下载及安装对应的gem套件并且能够帮我们解决不同套件之间的依存关系。同时它能够使得程序在不同的部署环境中使用的所有依赖包的版本都能够保持一致(因为Gemfile里面就作出限定,不同环境但是都是根据同一个gemfile文件),这样移植到其他电脑或者让别人协同开发只要都根据同一个gemfile就能保持一致。
Bundler的作用就是根据Gemfile的设置来保证在任何环境下安装的gem包都是同一个版本。
rails3的版本如果你想添加任何gem包都必须将其显式地写在Gemfile中,与之前更早的版本可以使用require关键词来引入gem包不同。我们现在用的是rails4的版本,统一使用gemfile进行统一管理明显更加方便,
Gemfile文件的如下代码表示只有在开发模式和测试模式中才使用里面的byebug这个gem包,如果想生产环境中也使用这个gem包那么在group关键词后面同样方式添加production就可以了
如下则是只有开发模式才能使用那个gem包
?
我们建议Gemfile中版本号写死了比较好,比如,再不济也要使用波浪号的(这种方式保证大版本号不变),这样写有什么好处呢?能够最大程度地降低由gem包升级造成的潜在的兼容性的风险,因为ruby和rails开源更新快,所以不把版本写死很可能会升级到一个新的你不熟悉的版本,从而导致兼容性问题。
比如说,版本号有三部分用点隔开,第一个版本号4发生变动表示发生的是不向下兼容的变动,这是x版本号。如果第二个版本号1发生变动表示有新的功能增加,这是y版本号。如果第三个版本号0变动,表示一些bug的修正,这是z版本号。所以你最不济也用~>来保证正常使用(大版本号不变,说明顶多是z版本号变动也就是修复一些bug而已)。
至于的>=就避免使用。
这样就能保证大型项目有一些升级的弹性又不至于升级太多导致不兼容的错误。
?
如果你修改了Gemfile这个文件,比如添加了新的gem包的声明代码,或者修改了已有gem包声明的版本,那么就需要使用一个命令叫bundle install来安装我们所有的gem包,这个命令会检查并安装这些gem包同时生成一个Gemfile.lock文件。Gemfile.lock文件会列出当前工程使用的gem套件的具体版本,那么要注意的是如果你使用git这样的工具进行工程的同步开发,那么你一定要记得开commit或者push的时候要把Gemfile.lock文件一并推送过去,这样其他上线的开发者就会安装这个Gemfile.lock里面指定的库文件,目的还是一个:保持多人开发gem版本的一致性。
下一个要讲的命令就是,bundle update 后面接上gem包的名字(不是gem_name)比如rails就会去更新相应的gem包版本。
只是bundle update后面无gem包名字,那么就是默认更新所有的gem包到最新版本。(不到必要,就别去使用bundle update这个命令,否则因为一次性更新太多gem包导致不兼容的概率是非常高的)。所以想升级gem包我们就在后面添加需要升级的gem包的名字,一次只升级一个就行。
?
总之,如果有gem包发生变动,那么一般情况下我们bundle install一个命令就能全部搞定。如果这个命令在执行过程中出现无法安装的gem包,打断了安装的运行(这种情况非常常见);那么就需要使用gem命令对这些无法安装的gem包进行单独的安装并根据提示信息来解决可能出现的错误。
?
那么怎么知道哪些gem包在我们工程里可以升级呢?那很简单,我们可以使用命令,就是已过时的命令这个命令会列出所有新版本、可升级的gem如下我们发现arel已经安装的版本是6.0.3,最新版本是7.0.0,想升级的话可以选择它进行升级就可以了。
bundle的命令有很多,实际上使用最多的是bundle install这个命令而已(相当于一键搞定按钮了)
?
以上是关于20--Bundle与Gemfile的主要内容,如果未能解决你的问题,请参考以下文章
Ruby 和“您必须使用 OpenSSL 支持重新编译 Ruby 或更改 Gemfile 中的源代码”
在开发过程中如何配置 Bundler/Gemfile 以使用不同的 gem 源?