该捆绑包当前的导轨锁定在 4.0.4
Posted
技术标签:
【中文标题】该捆绑包当前的导轨锁定在 4.0.4【英文标题】:The bundle currently has rails locked at 4.0.4 【发布时间】:2014-07-15 21:50:27 【问题描述】:在Gemfile
我做了如下改动:
-bash> git diff Gemfile
...
-gem 'rails', '4.0.4'
+gem 'rails', '4.0.5'
然后我运行bundle
并收到一条停止显示的消息:
-bash> bundle
Fetching gem metadata from https://rubygems.org/........
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
You have requested:
rails = 4.0.5
The bundle currently has rails locked at 4.0.4.
Try running `bundle update rails`
然后我按照上面的消息运行bundle update rails
,并得到以下信息(请注意,我正在跳过没有更改的行)。
-bash> bundle update rails
Fetching gem metadata from https://rubygems.org/........
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Installing rake 10.3.2 (was 10.3.0)
Installing multi_json 1.10.1 (was 1.9.2)
Installing activesupport 4.0.5 (was 4.0.4)
Installing actionpack 4.0.5 (was 4.0.4)
Installing actionmailer 4.0.5 (was 4.0.4)
Installing activemodel 4.0.5 (was 4.0.4)
Using activerecord-deprecated_finders 1.0.3
Installing activerecord 4.0.5 (was 4.0.4)
Installing railties 4.0.5 (was 4.0.4)
Installing rails 4.0.5 (was 4.0.4)
Your bundle is updated!
问题:这是预期的行为吗? According to another user, I expected to see what is locking the version.
问题:为什么rails
被锁定?有没有比我做的更好的方法来处理这种情况?
【问题讨论】:
【参考方案1】:这是预期的行为吗?
是的。 Gems 有依赖关系。当您更新 gem 时,它会获取更新后的依赖项(例如,在 rails 的情况下,它是它的 active* 部分)。
顺便说一下,这是成功的bundle update
的输出。这意味着在依赖解决中没有冲突。如果有冲突,你会看到它。 (类似'gem A 需要 gem B v1.2.3,但 gem C 使用 gem B v4.5.6')。
为什么铁轨被锁住了?
因为 Gemfile.lock 指定了 rails 版本 4.0.4。捆绑器、部署等将使用此版本(来自锁定文件)。只需更改 Gemfile 中的版本不会影响加载哪个 gem 版本。需要bundle install
/ bundle update
。
更新
有用的链接:http://viget.com/extend/bundler-best-practices
规则如下:
始终使用捆绑安装 如果您需要升级 Bundler 已经在管理的依赖项,请使用 bundle update gem_name。 除非您希望升级所有 gem,否则不要运行包更新。
【讨论】:
嗯..也许我还是不明白。我已经更新了过去的 gem,我不记得必须运行bundle update gem_name
- 我总是运行 bundle
(无参数),这相当于 bundle install
(until bundler v2
comes out some day)。刚才我正在进行更新,并更新了其他七个 gem,一次一个,并且能够只更新 Gemfile
中的版本并运行 bundle
。原来我刚才被逼跑bundle update jquery-rails
才发现,其实我还是不明白为什么。
消息You have requested: rails = 4.0.5
和The bundle currently has rails locked at 4.0.4.
不建议冲突。 jquery-rails
相同 - 我收到了类似的消息:You have requested: jquery-rails ~> 3.1.0
和 The bundle currently has jquery-rails locked at 3.0.4.
- 在这两种情况下,运行 bundle update gem_name
只是继续并更新了 gem(似乎与我使用 bundle
更新 gem 时没有什么不同(又名bundle install
))。我很想知道到底发生了什么。网上看了一堆博客和答案,还没有找到满意的答案。
@user664833:在这一点上,我认为您最好的来源是捆绑程序源代码。唯一确定的答案就在那里:)
好的,我将不得不跟进。我只想提一下,我是带着应有的尊重说话的,我真诚地重视你的回答和 cmets。你对为什么rails被锁定?的回答是因为Gemfile.lock
指定了rails版本4.0.4
。嗯,每个gem都在Gemfile.lock
中指定了一个版本。例如,我看不出rails
和passenger
之间没有区别,但rails
需要bundle update rails
才能更新,而passenger
只需bundle install
就可以了。注意:我对Gemfile
中的所有宝石都使用~>
,rails
除外。但是jquery-rails
再次表示它已锁定。好奇怪。
这是我在更改 rails 版本后尝试运行bundle install
时发生的情况:monosnap.com/image/ZZXsruvU5N7nazHbNYAvJ0V5w41wb8.png 我无法重现“gem 已锁定”的场景,所以我进行了有根据的猜测。也许与部署模式有关(您是否有机会尝试在已部署的生产环境中更新 rails 版本,或者其他什么)?以上是关于该捆绑包当前的导轨锁定在 4.0.4的主要内容,如果未能解决你的问题,请参考以下文章