如何使用Ruby 2.7.0修复Rails的警告消息


43

有人解决过这个问题Ruby 2.7.0吗?

我使用rbenv并安装了Ruby v2.7.0,然后使用创建了一个Rails项目Rails v6.0.2.1

目前,通过运行

rails s
rails s -u puma
rails s -u webrick

服务器启动并为站点提供服务,但是在Console日志中,我看到两个警告消息:

local:~/rcode/rb27$ rails s
=> Booting Puma
=> Rails 6.0.2.1 application starting in development 
=> Run `rails server --help` for more startup options
.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/actionpack-6.0.2.1/lib/action_dispatch/middleware/stack.rb:37: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/actionpack-6.0.2.1/lib/action_dispatch/middleware/static.rb:110: warning: The called method `initialize' is defined here
Puma starting in single mode...
* Version 4.3.1 (ruby 2.7.0-p0), codename: Mysterious Traveller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://127.0.0.1:3000
* Listening on tcp://[::1]:3000 

因此,警告消息为:

**.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/actionpack-6.0.2.1/lib/action_dispatch/middleware/stack.rb:37: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call**

**.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/actionpack-6.0.2.1/lib/action_dispatch/middleware/static.rb:110: warning: The called method `initialize' is defined here**

8
位置参数和关键字参数将在Ruby 3.0中分开。这仅仅是警告。Rails充满了这种模式。ruby-lang.org/en/news/2019/12/12/…–
乔什·布罗迪

3
@JoshBrody非常感谢。我看到了此链接,并且有一些建议切换警告,例如“如果要禁用弃用警告,请使用命令行参数-W:no-deprecated或在代码中添加Warning [:deprecated] = false。 ” 但是我在考虑为Actionpack v6.0.2.1更好的解决方案/修复
Nezir

全面隐藏弃用警告是一个坏主意,尤其是当您希望简化将来的升级时。
弗拉德

1
@Vlad同意,但是暂时减少日志噪音是可以的(如果您知道自己在做什么)
Khalil Gharbaoui

Answers:


54

要抑制警告,例如:

warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call

现在,只需将RUBYOPT环境变量添加前缀/将其传递给您的rails命令:

RUBYOPT='-W:no-deprecated -W:no-experimental' rails server
要么
RUBYOPT='-W:no-deprecated -W:no-experimental' rails db:migrate

这可能不适用于早期版本的ruby。

为了与早期版本的ruby向后兼容,请在其前面加上前缀RUBYOPT='-W0'

例:

RUBYOPT='-W0' bundle exec rspec

如果您不想在每次运行命令时都为此添加前缀,则只需将其添加到.zshrcor 的最后一行.bashrc(无论使用什么):

export RUBYOPT='-W:no-deprecated -W:no-experimental'
要么
export RUBYOPT='-W0'

另请参阅以下注释的最后一点:https :
//rubyreferences.github.io/rubychanges/2.7.html#warning-and-


1
与此相关的一个问题是,安装的-W:no-deprecated'标志无效的Ruby早期版本将引发错误。我通过使用export RUBYOPT ='-W0'修复了此问题
AugustoSamaméBarrientos

有没有一种方法可以调用不会发出警告的任务,即以不建议使用的方式调用它?
barlop

@barlop并不是发出警告的任务。警告来自基础代码。基本上可以找到折旧,如果它们在您自己的代码中,则可以进行修复。如果它们不是您的代码的一部分,则在您所包含的gem的存储库中打开问题或提出请求,并要求他们修复。或等待他们修复它。这里提到了一些弃用的地方:ruby-lang.org/en/news/2019/12/25/ruby-2-7-0-released以及这里:rubyreferences.github.io/rubychanges/2.7.html
Khalil Gharbaoui

@KhalilGharbaoui谢谢。我刚刚做了。新鲜的红宝石和铁轨iirc pastebin.com/SYjypsrP 看起来像我拥有的​​最新的一样,我所做的一切都是创建一个空白项目,尝试了rake帮助,并在rails db:migrate上得到了警告。我想我应该继续做那些回购。谈到提及actionpack的想法。rake db:migrate或rails db:migrate提到了actionpack,activerecord,activemodel。尽管其中一些甚至不是Rails的原生工具,但如此陌生,以至于Rails的人们无法正确理解。
barlop

5

显然,红宝石团队需要花一些时间才能在下一个红宝石版本中删除所有此警告。现在,您终端中的命令

`RUBYOPT='-W:no-deprecated' rails s` 

在我的基本,简单的新Rails 6.0.2.1和&ruby 2.7.0项目中,删除上面的两个警告行。

另外,用命令

RUBYOPT='-W:no-experimental' rails s

您将隐藏有关实验功能的警告。

您可以将这两个命令合并为一个命令,例如:

RUBYOPT='-W:no-deprecated -W:no-experimental' rails s

但是,我在使用Rails 5.2和ruby 2.6.4构建的旧项目中尝试了这些命令,后来又升级到rails 6.0.1,它们不能很好地处理我从不同的Rails Active *模块和ruby gems得到的所有警告消息。

可能我们需要一些时间来升级代码和gem,以获取最新的最新信息。


5

作为警告,不会影响任何内容。您可以简单地抑制它们。我发现解决方案2最适合我。

选项1.使用以下命令启动Rails服务器 RUBYOPT='-W:no-deprecated' rails s

选项2. export RUBYOPT='-W:no-deprecated在您的bash / zsh配置文件中设置

选项3.设置Warning[:deprecated] = false您的红宝石代码

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.