该捆绑包当前的导轨锁定在 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.5The bundle currently has rails locked at 4.0.4. 不建议冲突。 jquery-rails 相同 - 我收到了类似的消息:You have requested: jquery-rails ~> 3.1.0The 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中指定了一个版本。例如,我看不出railspassenger 之间没有区别,但rails 需要bundle update rails 才能更新,而passenger 只需bundle install 就可以了。注意:我对Gemfile 中的所有宝石都使用~>rails 除外。但是jquery-rails 再次表示它已锁定。好奇怪。 这是我在更改 rails 版本后尝试运行bundle install 时发生的情况:monosnap.com/image/ZZXsruvU5N7nazHbNYAvJ0V5w41wb8.png 我无法重现“gem 已锁定”的场景,所以我进行了有根据的猜测。也许与部署模式有关(您是否有机会尝试在已部署的生产环境中更新 rails 版本,或者其他什么)?

以上是关于该捆绑包当前的导轨锁定在 4.0.4的主要内容,如果未能解决你的问题,请参考以下文章

导轨捆绑清洁

向当前捆绑包 ID 添加前缀会重置钥匙串吗?

奏鸣曲捆绑包,我怎样才能获得当前登录的用户?

如何降级捆绑器或升级导轨?

获取当前操作的路径/url,包括查询字符串? (导轨)

SQL Server作业失败 - 帐户被锁定