我正在调查一个rails应用程序 - prod服务器安装了两个版本的特定gem,我如何知道prod应用程序正在使用哪个版本?
在 Rails 3 和 Rails 4 中,使用
bundle show
在 Rails 2 中,
rake gems
将打印出已安装、冻结的 gem、依赖项和版本等。
如果你使用bundler,那么你可以从
获取版本bundle show [gemname]
我花了比预期更长的时间来查找和整理这些信息,因此我想将其发布在一个地方以供其他人查看。我还想为 Rails 3 澄清一下这一点:
script/about 已替换为
rake about
详细信息在 here。如果您对 Rails 3 的所有命令行更改的列表感兴趣,可以在here找到它们。rake gems
在 Rails 3 中不起作用。相反,您应该使用 bundle show
例如,您可以将宝石的所有版本保存到文件中以供查看:
gem list > all_gems.txt
您可以查看 Rails 应用程序正在使用的版本:
bundle show > project_gems.txt
使用像 Vim 这样的编辑器,您可以轻松地使用 vimdiff 来查看更改
在航站楼
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 '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 版本时,这多次拯救了我,并且 gem 进行了重大更改更新。
尝试使用
script/about
。您的config/environment.rb
也有相关信息。
在您的
config/environment.rb
中,您可以指定应用程序应使用特定 gem
的哪个版本。但是,如果您的计算机上安装了多个版本的 gem
并且未指定版本,则应用程序将使用该 gem 的最新版本。
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)
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 的所有版本。默认情况下,它将使用最新的可用版本。
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 info [gemname]
捆绑显示宝石名称 也就是说,对于 devise,你必须这样写
bundle show devise
它会打印出当前的gem版本。
在新版本中,使用了
bundle show gem_name
[DEPRECATED] use `bundle info gem_name` instead of `bundle show gem_name`
尝试一下这个当地的宝石:
gem list gemname | grep -P '(^|\s)\Kgemname(?=\s|$)'
如果您使用捆绑包:
bundle exec gem list gemname | grep -P '(^|\s)\Kgemname(?=\s|$)'
bundle info <your-gem> --version
将打印出已安装的版本字符串
在 Gemfile 中,应该有答案:
gem 'rails', '4.0.0.rc1'