为什么有了 Gemfile 文件还需要一个 Gemfile.lock 文件,我知道是为了在多种场合下保持 gem 版本一致,比如在开发和部署时,或者你有多台不同的开发机器,或者项目有多人开发。但是它到底是如何保持的,一直比较迷惑。下面简要记录一下:
首先,Gemfile 文件所列的 gem 只是项目依赖的一部分,gem 本身也有自己的依赖,不同的 gem 本身可能依赖了某一 gem 不同的版本,如何让这么多不同版本的依赖相安无事,不发生冲突,这就是 bundle 的发挥作用的时候了。bundle 不仅用来安装 gem,更重要的是还负责计算出不同 gem 的依赖版本,最终生成 Gemfile.lock 文件,该文件记录了确切的 gem 名称和版本号,以及他们所依赖的 gem 的名称和版本号。
第一次运行 bundle install
时自动生成 Gemfile.lock 文件。
以后每次运行 bundle install
时,如果 Gemfile 中的条目不变 bundle 就不会再次计算 gem 依赖版本号,直接根据 Gemfile.lock 检查和安装 gem。
如果出现依赖冲突时可以通过 bundle update 更新 Gemfile.lock。
这篇文章说的比较详细。