【问题标题】:How do I fix Rubygems recent deprecation warning?如何修复 Rubygems 最近的弃用警告?
【发布时间】:2011-05-10 11:47:06
【问题描述】:

我最近运行了更新:

gem update --system
gem update

现在,我每次加载 gem 时都会收到很多弃用警告。例如rails console:

NOTE: Gem::Specification#default_executable= is deprecated with no replacement. It will be removed on or after 2011-10-01.
Gem::Specification#default_executable= called from /Users/user/.rvm/gems/ruby-1.9.2-p180@global/specifications/rake-0.8.7.gemspec:10.
NOTE: Gem::Specification#default_executable= is deprecated with no replacement. It will be removed on or after 2011-10-01.
Gem::Specification#default_executable= called from /Users/user/.rvm/gems/ruby-1.9.2-p180@global/specifications/rake-0.8.7.gemspec:10.
NOTE: Gem::Specification#default_executable= is deprecated with no replacement. It will be removed on or after 2011-10-01.
Gem::Specification#default_executable= called from /Users/user/.rvm/gems/ruby-1.9.2p180@global/specifications/rake-0.8.7.gemspec:10.
Loading development environment (Rails 3.0.7)
ruby-1.9.2-p180 :001 > exit

我使用 RVM、Ruby 1.9.2 和 Rubygems 1.8.1。有什么办法可以解决这个问题?恢复到旧版本的 ruby​​gems?

【问题讨论】:

标签: ruby rubygems rvm suppress-warnings


【解决方案1】:

我不得不降级到 1.6.2。这些通知绝对是荒谬的。他们使最新版本完全无法使用。确实应该有办法禁用它们,但在那之前:

sudo gem update --system 1.6.2

【讨论】:

  • 不幸的是,这对我不起作用。使用 mac、rvm (1.92) 和 Snow Leopard。
  • @mr-walinzi 我不敢说实话。我只想安静地开发我的rails应用程序,我可以用1.6.2做到这一点
  • Edit 我现在已经升级回 1.8.4。 gem pristine ... 解决方案似乎运作良好
  • 回滚总是会引入它自己的问题 - 对我来说,这个命令无论如何都不起作用 - 在 ruby​​ 1.9.1 ruby​​gems.rb:483:in find_files': undefined method map' for Gem: :Specification:Class (NoMethodError)
  • 我尝试运行提到的命令,但它不起作用。显示以下错误消息。获取 ruby​​gems-update-1.6.2.gem 错误:执行 gem ... (Gem::FilePermissionError) 您没有 /usr/bin 目录的写入权限
【解决方案2】:

看这里http://ryenus.tumblr.com/post/5450167670/eliminate-rubygems-deprecation-warnings

简而言之,运行

gem pristine --all --no-extensions

ruby -e "`gem -v 2>&1 | grep called | sed -r -e 's#^.*specifications/##' -e 's/-[0-9].*$//'`.split.each {|x| `gem pristine #{x} -- --build-arg`}"

如果反引号(或反引号)对您不起作用,正如@jari-jokinen 指出的那样(谢谢!),在某些情况下,用这个替换第二行

ruby -e "%x(gem -v 2>&1 | grep called | sed -r -e 's#^.*specifications/##' -e 's/-[0-9].*$//').split.each {|x| %x(gem pristine #{x} -- --build-arg)}"

注意:如果您在生产环境中使用 Bundler,您的违规 gem 将被缓存到 shared/bundle,因此您需要使用 bundle exec 运行这些命令

【讨论】:

  • 第一个命令效果很好,但第二个命令给我一个语法错误(Ruby 1.8.7-p249)。还有其他人吗?
  • 我在第二行也有语法错误,所以我只是手动完成了。检查gem -v 2>&1 | grep called 的输出,对于该命令返回的每个gem,执行gem pristine GEM_NAME_HERE -- --build-arg。您可能还需要使用sudo
  • 嗯,@aidan-feldman,@mirthlab,请问这是什么语法错误?我认为第二行没有使用任何仅 ruby​​ 1.9 的功能,可能缺少 sed 或 sudo?
  • 反引号不适用于 Ruby Enterprise Edition 2011.03 (1.8.7) 和/或 Bash 4.1.5(1),因此我将它们替换为 %x[] ,如下所示:ruby -e "%x[gem -v 2>&1 | grep called | sed -r -e 's#^.*specifications/##' -e 's/-[0-9].*$//'].split.each {|x| %x[gem pristine #{x} -- --build-arg]}"
  • OSX/BSD 系统将获得sed: illegal option -- r,因为 sed 使用不同的标志。而是将-r 替换为-E,即:ruby -e "%x[gem -v 2>&1 | grep called | sed -E -e 's#^.*specifications/##' -e 's/-[0-9].*$//'].split.each {|x| %x[gem pristine #{x} -- --build-arg]}"
【解决方案3】:

您还可以使用更特定于 RVM 的 rvm rubygems current 来返回更安全的 gem 版本(现在是 1.6.2)。

【讨论】:

  • 谢谢! -> 在我的情况下,我使用 rvm 和 ruby​​-1.8.7-p302,运行电流仍然给我 ruby​​gems 1.8.6 及其所有警告; rvm install rubygems 1.6.2 成功了。
【解决方案4】:

我采纳了其他人的答案,并将它们编写成对我来说更有用的东西。我仍然不得不从 /usr/local/cellar 中手动删除一对。

#!/usr/bin/env bash
#

brew install gnu-sed
sudo gem pristine --all --no-extensions
gems=$(gem -v 2>&1 | grep called | gsed -r -e 's#^.*specifications/##' -e 's/-[0-9].*$//')

for gem in $gems
do
  echo Fixing $gem...
  sudo gem pristine $gem -- -build-arg
done

【讨论】:

  • 需要一个 Scala 人才能正确修复 Ruby gem!
【解决方案5】:

我可以确认 1.8.10 已经在 Rails 3.1 环境中删除了这些弃用警告。

简单运行

gem update --system

【讨论】:

    【解决方案6】:

    安装 ruby​​gems 1.8.4 版可以消除 gem 规范弃用警告:

    $ gem update --system

    === 1.8.4 / 2011-05-25

    • 1 次小改进:

      • 从规范中删除了 default_executable 弃用。

    【讨论】:

      【解决方案7】:

      运行这个命令 sudo gem pristine --all --no-extensions

      删除所有这些警告消息。

      【讨论】:

        【解决方案8】:

        更简单:将以下内容添加到environment.rb

        ActiveSupport::Deprecation.silenced = true
        

        【讨论】:

          【解决方案9】:

          首选解决方案

          使用这个,感谢gmarik's gist

          .bashrc:

          if [ -d "$HOME/.ruby/lib/" ]; then
            RUBYLIB="$RUBYLIB:$HOME/.ruby/lib"
            RUBYOPT="-rno_deprecation_warnings_kthxbye"
            export RUBYLIB RUBYOPT
          fi
          

          ~/.ruby/lib/no_deprecation_warnings_kthxbye.rb

          begin
          require 'rubygems'
          Gem::Deprecate.skip = true if defined?(Gem::Deprecate)
          rescue LoadError => e
            p e
          end
          

          后备解决方案

          在以下情况下使用它:

          • 您使用 RVM 并将 gem 保存在中 ~
          • 您不能使用 $RUBYLIB,因为您的 IDE 在运行单元测试时会忽略它
          • 您无法升级到最新的 Rubygems,因为 Gemfile 中有一些旧的、未维护的 gem

          修改rubygems/deprecate.rb

          def self.skip # :nodoc:
            @skip ||= true
          end
          

          【讨论】:

            【解决方案10】:

            我尝试了上述所有选项,但没有任何效果。

            最后,我卸载了 Ruby 和所有依赖项,使用链接 https://rvm.io/rvm/install 安装了 RVM, 并使用 rvm install ruby 重新安装了 Ruby。

            一切正常!

            【讨论】:

              【解决方案11】:

              看起来你没问题,这只是一个警告,rake-0.8.7.gemspec 将不符合 RubyGems 的新标准。

              我确信 rake 的创建者会得到这个同步。

              【讨论】:

              • 这不仅仅是 Rake。它会影响许多其他 gem,如果它们使用本机代码,则需要重新安装它们。
              【解决方案12】:

              发现它来自Gem::Version.correct?(nil),所以 grep

              【讨论】:

                【解决方案13】:

                SlimGems 也可能是一个解决方案。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-12-25
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多