我正在调查一个 Rails 应用程序 - prod 服务器安装了两个版本的特定 gem,我如何知道 prod 应用程序正在使用哪个版本?

有帮助吗?

解决方案

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

在Rails 2中, rake gems 将打印出安装,冻结等所有宝石,依赖项和版本。

其他提示

如果使用bundler,则可以从

获取版本
bundle show [gemname]

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

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

  • rake gems 在 Rails 3 中不起作用。相反,你应该使用 bundle show

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

gem list > all_gems.txt

您可以查看 Rails 应用程序正在使用的版本:

bundle show > project_gems.txt

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

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

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版本时,这已经不止一次地保存了我,并且宝石已经更新了更改。

在终端

bundle show [gem-name]
bundle show | grep [gem-name]

gem list | grep [gem-name]

[gem-name]应该替换为您要查找的宝石名称。

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

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

gem list <gemname>

它将显示所有匹配的gems,例如,如果有人

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和Rack Gems的版本,但不会告诉您。理想情况下,如果您查看 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';在任何给定文件的顶部需要'some_random_thing'

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

bundle exec gem which gem_name

可能是您可以使用的:

<*>#8250; bundle exec gem which rails
/Users/xxxx/.rvm/gems/ruby-2.1.2@gemset/gems/railties-4.1.7/lib/rails.rb

尝试本地宝石:

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

如果你使用bundle:

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

捆绑show gemname I.e for devise你必须像

一样写
bundle show devise

它将打印出当前的宝石版本。

在Gemfile中,应该有答案:

gem 'rails', '4.0.0.rc1'
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top