如何在旧的Gemfile.lock中恢复已安装的gem和所有依赖项版本

时间:2017-04-17 18:28:24

标签: ruby-on-rails ruby rubygems

我有一个Rails 4应用程序。前段时间,在运行bundle installbundle update之后,我的应用程序开始出现问题。我发现法拉第宝石造成了一些问题,并且由于其他一些宝石依赖它,我无法卸载它。然后我发现我的项目备份是在我发出bundle install / bundle update命令之前的。那时我的申请表现很好。

当我将旧的Gemfile.lock与当前版本进行比较时,我发现有些宝石现在有了更新的版本。我相信存在应用问题的原因。

这些只是我当前的Gemfile.lock中的宝石:

   oauth2 (1.3.1)
      faraday (>= 0.8, < 0.12)
      jwt (~> 1.0)
      multi_json (~> 1.3)
      multi_xml (~> 0.5)
      rack (>= 1.2, < 3)
    omniauth (1.4.2)
      hashie (>= 1.2, < 4)
      rack (>= 1.0, < 3)
    omniauth-oauth2 (1.4.0)
      oauth2 (~> 1.0)
      omniauth (~> 1.2)
    omniauth-yandex (0.0.2)
      omniauth (~> 1.0)
      omniauth-oauth2 (~> 1.0)

我的旧Gemfile.lock来自应用程序运行良好时:

oauth2 (1.3.0)
  faraday (>= 0.8, < 0.11)
  jwt (~> 1.0)
  multi_json (~> 1.3)
  multi_xml (~> 0.5)
  rack (>= 1.2, < 3)
omniauth (1.3.2)
  hashie (>= 1.2, < 4)
  rack (>= 1.0, < 3)
omniauth-oauth2 (1.4.0)
  oauth2 (~> 1.0)
  omniauth (~> 1.2)
omniauth-yandex (0.0.2)
  omniauth (~> 1.0)
  omniauth-oauth2 (~> 1.0

我当前和以前的Gemfile是相同的:

gem 'tinymce-rails'
gem 'mysql2', '~> 0.3.18'
gem 'humanizer'
gem 'globalize', '~> 4.0.3'
gem "paperclip", "~> 4.2"
gem 'remotipart', '~> 1.2'
gem 'mailcatcher', '~> 0.6.1' ,        group: :development
gem 'rufus-scheduler', '~> 3.1.2'
gem "omniauth-yandex"
gem 'friendly_id', '~> 5.1.0'
gem 'devise'
gem 'rest-client', '~> 1.8'
gem "cocoon"

是否有可能以某种方式将某些宝石及其依赖降级为旧Gemfile.lock中的版本?

我的应用只需要omniauth-yandex个宝石。

4 个答案:

答案 0 :(得分:2)

您应该尝试在文件中添加gems的特定版本。这样,您将拥有特定gem所需的依赖版本。

答案 1 :(得分:1)

我使用我的Rails应用程序几次遇到过这种情况。由于这是您可能经常遇到的问题,我建议您确保使用某种类型的版本控制系统,如Git。确保在安装gem或更新Gemfile.lock(即运行bundle install或bundle update)之前,先提交以前的更改。这样,如果您需要将项目的Gemfile.lock文件恢复到以前的状态,那么操作起来会容易得多。还有另一个StackOver线程在How to undo last commit(s) in Git?

恢复您的提交

如果您不熟悉Git,那么https://git-scm.com/book/en/v2

上有一本很棒的免费在线图书

如果您还没有机会提交更改,以便可以返回之前的Gemfile和Gemfile.lock,那么最好的办法就是像Vineeth一样指定所需的宝石版本。如果您需要参考http://bundler.io/v1.5/gemfile.html#gemfiles

,Bundler文档会详细说明如何执行此操作

确保在Gemfile中指定版本后,运行:

bundle update

这将使用您需要的特定版本更新Gemfile.lock文件。

希望有所帮助! :)

答案 2 :(得分:1)

您可以在gemfile中添加该gem的特定版本并进行bundle install,它应该更新所有必需的依赖项。

答案 3 :(得分:0)

如果您正在使用Github,则可以运行git revert

这将恢复为较旧的提交(您选择要恢复的提交),从而删除提交后所做的更改。