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


116

我正在研究Rails应用程序-产品服务器已安装了两个版本的特定gem,如何确定该产品正在使用哪个版本?


您是在问哪个版本的rails或某个其他版本的gem?
BJ克拉克

1
特定宝石的哪个版本。
史蒂夫·布鲁尔

我在供应商/宝石下冻结了一个宝石,然后在默认宝石位置安装了较新版本的宝石。我从导轨上看到“我从这个位置加载了这个宝石”的东西。
史蒂夫·布鲁尔

Answers:


172

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

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


2
仅当environment.rb文件中指定了gem时,此方法才有效。如果开发人员只是在某个地方需要它,那么rake gems将无法工作。
约翰·海兰德

(或在config / environments / *文件之一中,具体取决于您的RAILS_ENV。)
John Hyland 2009年

2
如果要过滤列表bundle show | grep gem_name,请使用罗盘示例:bundle show | grep compass
Adam Waite 2013年

因此,当您输入bundle show并获得一堆包含“ rails 2.3.17”版本的宝石,并且输入rake gems时,您得到的是看起来像图例(I =已安装等)但没有gems /版本?是否有Rails版本2?也许我有Rails版本2和更高级的捆绑器?这是好事还是不好?(是的,我知道拥有这么旧的Rails版本是不好的,我想知道是否–如此不匹配的轨道和捆扎机(如果是的话)是灾难性的)
Brenda J. Butler

39

如果使用捆绑程序,则可以从以下版本获取版本

bundle show [gemname]

我来到了这个问题,因为我想移动打捆(可能很多人也,因为现在的Heroku这个要求)
GreenAsJade

不推荐使用。使用bundle info [gemname]代替。
collimarco

37

我花了比预期更长的时间来查找和整理这些信息,因此我想将其发布在这里以供其他人查看。我还想为Rails 3澄清一下:

  • 脚本/关于已被替换为rake about 详细信息在这里。如果您对Rails 3的所有命令行更改列表感兴趣,可以在此处找到。

  • rake gems 在Rails 3中不起作用。您应该使用 bundle show

例如,您可以将所有版本的宝石保存到文件中,以供查看:

gem list > all_gems.txt

然后您可以查看您的Rails应用程序使用的版本:

bundle show > project_gems.txt

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


6

可能有更直接的方法可以找到答案,但是如果您加载控制台并需要特定的版本,例如:

gem 'RedCloth', '3.0.4'

它会告诉您已经激活了哪个版本:

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

6

在终端

  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

5

里面还有一个清单 Gemfile.lock应用的根目录中。

因此我离开 Gemfile.lock不在我的范围内.gitignore。当我忘记在中指定gem版本GemFile,并且gem进行了重大更改更新时,这为我节省了不止一次。


4

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

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


3
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)

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"

运气好的话,该应用程序的作者将在其中包含所有必需的gem和版本。但是,版本在此文件中是可选的,并且最终没有什么可以阻止没有经验的开发人员仅将a拍require 'rubygems'; require 'some_random_thing'在任何给定文件的顶部。

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


您的脚本/简介是否告诉您有关宝石的信息?我的只是告诉我我使用的是什么版本的红宝石,铁轨和环境。
BJ克拉克

是的,Rails(和Rack)都是gem,脚本/ about会告诉您它们正在运行的是哪个版本,以及Rails的核心内容(ActiveSupport等),但不会告诉您其他gem。很抱歉,如果不清楚。
约翰·海兰德

1
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 which gem_name
cori


0

试试这个本地的宝石:

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

如果使用捆绑软件:

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

0

在较新的版本中, bundle show gem_name

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

0

如果使用捆绑程序,则可以使用以下版本获取版本:

bundle info [gemname]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.