新手问题 Gemfile.lock 該加入 .gitignore 嗎?

xdxie · 2013年02月28日 · 最后由 fsword 回复于 2013年03月02日 · 6372 次阅读

我在 local 端開發時該把 Gemfile.lock 加入到.gitignore 否?

現在的狀況是 server 的 rdoc 已經 update 到 4.0;local 端的 rdoc 在 3.12 local 的 Gemfile 裡面沒有指明 rdoc 版本,產生的 Gemfile.lock 正是 local 的 3.12 當我 deploy 到 server 時,會先 bundle install 再 rake precompile 就會遇到 rake aborted! Could not find rdoc-3.12.2 in any of the sources 的問題,這 rdoc 根本不會是我 rails app 會用到的套件,難道我的 sever 要為這個不會用到的套件進行更新?還是在 local 的 Gemfile 就指明 rdoc 版本 (這樣就會安裝兩個版本的 rdoc!?)?不知道大家遇到類似的問題都是用什麼方式解決呢?

简单的说:Never

Gemfile.lock 的意义就是确保大家用的 gem 版本都是一致的,当然要放入版本控制

請問我遇到的問題該如何解決呢?

应该加入,不然 deploy 的时候要安装一堆 gem 啊

如果你想要给本地升级 rdoc,命令是 bundle update rdoc@local 如果你想要纠正 server 的 rdoc,命令是 bundle install@server

如果你还有类似的问题,建议到这里 http://gembundler.com 阅读文档并理解 bundler, Gemfile,Gemfile.lock 的机制。

这里有个收费的 Screencast,可以帮助你理解 bundler 的工作机制:http://railscasts.com/episodes/201-bundler-revised

#5 楼 @lgn21st 我真希望那个叫 @local@server 的用户跳出来问:”@ 我们干啥“

#7 楼 @hbin 被你这么一说... 还真有可能啊。

插一句题外话,我一直觉得 gem install 默认应该加上 --no-ri --no-rdoc

原來我的問題是佈署上出的問題,我的 deploy.rb 並沒有加入 require "bundler/capistrano" 而是自己寫的 before "deploy:assets:precompile","deploy:bundle_install" task :bundle_install do run "cd #{current_path} && bundle install" end 雖然問題解決,不過還滿想知道我的 task 問題出在哪。 放了 bundler/capistrano 後多出 幫我做了 bundle install --gemfile

#9 楼 @ashchan 我手動新增~/.gemrc 檔案並加入 gem:...--no-rdoc 沒有作用

#11 楼 @xdxie 格式是这样的:

---
install: --no-rdoc --no-ri
update:  --no-rdoc --no-ri

但跑 deploy 时用到的用户会不会去读这个不好说。(很抱歉,设 --no-rdoc 对解决这个帖子里描述的问题没什么帮助,只是看到 rdoc 而提一下)

#13 楼 @hooopo 原来如此,受教了,Yahuda 的 Blog URL 是那一篇阿?很有兴趣想要读一下。

按说要提交,版本一致,没那么多事。不过话说我昨天把这货从版本库里删了,因为是自己的站,加上我是个升级狂……

@lgn21st 有一种情况要加入,开发使用 win 部署在 linux 或者反过来,有些 gem 比如 mysql2 会在 gemfile.lock 里标示平台信息 mysql2-x86 然后另一个环境里 bundle 的时候就挂掉了。。。

我用了某个 rails 社区的源码在本地环境。结果我其他的 app 直接无法启动了。来下面的错误。

You have already activated eventmachine 1.0.1, but your Gemfile requires eventmachine 1.0.0. Using bundle exec may solve this. (Gem::LoadError)

我把 gemfile.lock 删除,重新 bundle 一次就好了,我不知道具体是什么原因。

#20 楼 @metal 这不是 Gemfile.lock 的错误,恰恰是它的必要性所在,提示已经很清晰了,你应该用 bundle exec 做之前的事情

Gemfile.lock 是很好的设计,它把应用的外部依赖全部锁定,确保了开发环境的一致性,这对质量保证非常重要,相比之下,maven 之类的工具简直弱爆了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号