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

我正在调查一个 Rails 应用程序-prod 服务器有两个版本的一个特定的 gem 安装,我怎么能告诉哪个版本的 prod 应用程序正在使用?

106308 次浏览

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

config/environment.rb中,您可以指定应用程序应该使用特定 gem的哪个版本。但是,如果您的机器上安装了多个版本的 gem,而您没有指定版本,那么应用程序将使用该 gem 的最新版本。

可能有一个更直接的方法可以找到这个问题,但是如果你加载一个控制台并且需要一个特定的版本,比如:

gem 'RedCloth', '3.0.4'

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

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

script/about将告诉您正在使用的核心 Rails 和 Rack gem 的版本,但不会告诉您其他任何版本。理想情况下,如果你查看 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"

如果幸运的话,应用程序的作者可能已经包含了任何所需的宝石和版本。但是,这个文件中的版本是可选的,最终没有什么能够阻止一个没有经验的开发人员在任何给定文件的顶部使用 require 'rubygems'; require 'some_random_thing'

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

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

在 Rails 2中,rake gems将打印出安装、冻结等的 gem、依赖项和版本。

如果您使用 bundler,那么您可以从

bundle show [gemname]

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

  • Script/about 已被 rake about取代,详细资料为 给你。如果您对 Rails 3中所有命令行更改的列表感兴趣,可以找到 给你

  • rake gems在 Rails 3中不能工作。相反,您应该使用 bundle show

例如,您可以将 gem 的所有版本保存到一个文件中,以便使用以下命令查看:

gem list > all_gems.txt

你可以看到你的 Rails 应用程序正在使用的版本:

bundle show > project_gems.txt

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

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

因为这个原因,我离开我的 .gitignore Gemfile.lock。当我忘记在 GemFile中指定 gem 版本时,这已经不止一次地挽救了我,并且 gem 被更新为重大更改。

在 Gemfile,答案应该是:

gem 'rails', '4.0.0.rc1'
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

在航站楼

  bundle show <gem-name>
bundle show | grep <gem-name>

或者

  gem list | grep <gem-name>

例如:

  bundle show rails
bundle show | grep rails


gem list | grep rails
gem list <gemname>

它会显示所有匹配的宝石,例如,如果有人这样做

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)

试试这个当地的宝石:

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

如果使用 bundle:

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

捆绑显示宝石名称 也就是说你得写得像

bundle show devise

它会打印出当前的 gem 版本。

在新版本中,使用了 bundle show gem_name

[DEPRECATED] use `bundle info gem_name` instead of `bundle show gem_name`

如果您使用 bundler,那么您可以使用:

bundle info [gemname]