如何判断 Rails 应用程序正在使用哪个版本的 gem
-
06-07-2019 - |
题
我正在调查一个 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'