如何判断一个rails应用程序正在使用哪个版本的gem

我正在调查一个rails应用程序 – prod服务器有两个版本的特定的gem安装,我怎么知道哪个版本的prod应用程序正在使用?

在Rails 3和Rails 4中,使用bundle show

在Rails 2中, rake gems将打印出什么gem,依赖和版本被安装,冻结等。

我花了比预期更长的时间来查找和分类这些信息,所以我想把它张贴在一个地方供其他人查看。 我也想为Rails 3澄清一点:

  • 脚本/关于已被取代rake about细节在这里 。 如果您对Rails 3的所有命令行更改感兴趣,可以在这里find它们。

  • rake gems不适用于Rails 3.相反,你应该使用bundle show

作为一个例子,您可以将所有版本的gem保存到一个文件,以便查看:

gem list > all_gems.txt

你可以看到你的Rails应用程序使用的是什么版本:

bundle show > project_gems.txt

使用像Vim这样的编辑器,您可以轻松使用vimdiff来查看更改

如果你使用捆绑器,那么你可以从中获取版本

 bundle show [gemname] 

在terminal

 gem list | grep xxx 

要么

 bundle show | grep xxx 

xxx应该被replace为您要查找的gem名称

有可能是一个更直接的方法来找出这一点,但如果你加载一个控制台,需要一个特定的版本,如:

 gem 'RedCloth', '3.0.4' 

它会告诉你什么版本已经被激活:

 => Gem::LoadError: can't activate RedCloth (= 3.0.4, runtime) for [], already activated RedCloth-4.2.2 

Gemfile.lock还有一个列表,位于应用程序的根目录中。

出于这个原因,我把Gemfile.lock放在我的.gitignore 。 当我忘记在GemFile指定gem版本时,这已经救了我GemFile ,并且一个gem更新了突变。

尝试使用script/about 。 你的config/environment.rb也有关于它的信息。

在你的config/environment.rb你可以指定应用程序应该使用的特定gem版本。 但是,如果您的计算机上安装了多个版本的gem ,并且未指定该版本,则应用程序将使用该gem的最新版本。

 gem list <gemname> 

它会显示所有匹配的gem,如果有人做

 gem list rack 

那么输出结果如下

 *** LOCAL GEMS *** rack (1.6.4) rack-mount (0.6.14) rack-test (0.6.3, 0.6.2, 0.5.7) 

script/about会告诉你你正在使用的核心Rails和Rackgem的版本,但不是别的。 理想情况下,如果你看看config/environment.rb ,应该有一个看起来像这样的部分:

 # Specify gems that this application depends on and have them installed with rake gems:install # config.gem "bj" # config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net" # config.gem "sqlite3-ruby", :lib => "sqlite3" # config.gem "aws-s3", :lib => "aws/s3" 

幸运的是,应用程序的作者将包括所有必需的gem和版本。 然而,这个版本在这个文件中是可选的,最终没有什么能阻止一个没有经验的开发者从一个require 'rubygems'; require 'some_random_thing' 在任何给定文件的顶部require 'rubygems'; require 'some_random_thing'

如果您看到需要使用gem,但未指定版本,则可以键入gem list以查看系统上所有gem list所有版本。 默认情况下,它将使用最新的一个。

 bundle exec gem which gem_name 

大概是你可以使用的:

 $› bundle exec gem which rails /Users/xxxx/.rvm/gems/ruby-2.1.2@gemset/gems/railties-4.1.7/lib/rails.rb 

试试这个当地的gem:

 gem list gemname | grep -P '(^|\s)\Kgemname(?=\s|$)' 

如果你使用bundle:

 bundle exec gem list gemname | grep -P '(^|\s)\Kgemname(?=\s|$)' 

在Gemfile中,应该有答案:

 gem 'rails', '4.0.0.rc1'