瞎扯淡 ignore Gemfile.lock 可以理解 为啥要 ignore Gemfile

helapu · July 07, 2017 · Last by darkbaby123 replied at July 07, 2017 · 2755 hits

都是泪

起因是同事的 ubuntu 系统开发机器无法启动 rails c。据说是因为 gem spring 导致的,是否有这个可能?我让它按照 nodejs 环境。 同事嫌麻烦,然后我建议可以将 gem spring 注释便可 后来就是上面的提交记录了 你难道就不心痛吗

gem spring 会导致 rails c 无法启动吧,安装 nodejs 也是可以的吧,你们遇到过吗?

不加 Gemfile 的话,可以质疑你这个同事关于依赖管理的基本素养了,不夸张。

为了更好的协同开发,要求同事间的开发环境尽可能的一致这个也是强烈建议项(甚至强烈建议开发环境跟生产环境一致),某些 Gem 会在 Gemfile.lock 里标记一些平台要求的信息,这会在某些情况下,你的同事有混杂使用不同 OS,bundle 失败,所以包不包含 Gemfile.lock 倒是一个没有结论的问题,看需要。

另外,对于某个 Gem 的卡住安装这种,显然的,这位同事应该自己解决自己的环境问题(写 Rails 项目不想装 Rails 这个怎么讲都说不过去的),但是,实际上 bundler 还真可以做到不安装某些 Gem 的。

这个功能在我不知道该去哪读那该死的文档呢?

看一段 Capistrano 的输出:

00:15 bundler:install
      01 ~/.rvm/bin/rvm default do bundle install --path /home/jasl/sites/lab/shared/bundle --jobs 3 --without development test --deployment --quiet

注意 --without 后边的两个实参是 development test,对应 Rails 的 Gemfile 里的 development 和 test group,所以,你只需要吧 spring 单独放到一个 group 里

group :spring do
  gem 'spring'
end

然后

bundle install --without spring 即可了,这个手法 Redmine 就在用 https://github.com/redmine/redmine/blob/master/Gemfile#L42-L45 用来解决一些对环境有依赖的可选功能,另外他们那边也有讨论(我现搜的) http://www.redmine.org/boards/2/topics/29070

PS,spring 会 wrap 一些 gem 的 binstub(就是项目目录 bin 下的那些命令),不安装 spring 的话使用某些命令调用会失败。

我们组里现在都是要求把 Gemfile.lock 提交进仓库的,原因是如果不提交,遇到过在两台服务器上部署,asset pipeline 后的 fingerprint 值不一样。

无论 Gemfile 还是 Gemfile.lock都应该加入版本管理啊... 即使不同平台,也应该在Gemfile中声明和控制..lock 存在的意义就是保证你 gem 行为的统一..尤其是某些 gem 偷懒并没有明确指定依赖的版本的情况下。

至于某些 gem 报错,对照错误信息解决...解决不了也应该有个具体原因...

ignore Gemfile.lock??那还用什么 bundler 呀...

Gemfile.lock 和 Gemfile 都要加到版本控制,这不是常识嘛

http://bundler.io/v1.3/rationale.html#checking-your-code-into-version-control

Reply to jasl

Gemfile.lock 会包含一些平台相关的 这个忽略没有太大问题 但是仍然会保留一份 偶尔会遇到 bug 跟版本相关 比如我开发机上的某个 gem 版本为 1.9,但是生产环境上每次都 bundle 的话 可能会到 2.1 这样的版本升级很容易出问题 我会留意这个

Reply to helapu

一般包含进来,另外包不包含,也要合理的在 Gemfile 里约束好依赖的版本

Reply to flypiggys

这个怎么声明平台相关? 像这样吗

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
Reply to helapu

嗯,上面姜军发的 redmine 的 gemfile 里面就有很好的例子。一般共识好像是在应用开发中,应该包含 lock,gem 开发中不应该包含 lock 文件

Clarifying the Roles of the .gemspec and Gemfile

Reply to jasl

明白这个技巧了


platforms :mri, :mingw, :x64_mingw do
  # Optional gem for exporting the gantt to a PNG file, not supported with jruby
  group :rmagick do
    gem "rmagick", ">= 2.14.0"
  end

  # Optional Markdown support, not for JRuby
  group :markdown do
    gem "redcarpet", "~> 3.4.0"
  end
end

自己的项目

group :spring do
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

我这边改了 但是要在同事的电脑上才比较方便的测试 是否生效

bundle install --without spring

别解决 ignore 的问题,解决同事……

u1440247613 in 这下真伤心了 mention this topic. 08 Jul 02:21
You need to Sign in before reply, if you don't have an account, please Sign up first.