So beheben Sie die Warnmeldungen von Rails mit Ruby 2.7.0

43

Hat jemand dieses Problem mit gelöst Ruby 2.7.0?

Ich habe rbenvRuby v2.7.0 verwendet und installiert und dann ein Rails-Projekt mit erstellt Rails v6.0.2.1.

Derzeit durch Ausführen eines von

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

Der Server ist aktiv und die Site wird bedient, aber im ConsoleProtokoll werden zwei Warnmeldungen angezeigt:

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 

Die Warnmeldungen lauten also:

**.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**
Nezir
quelle
8
Positionsargumente und Schlüsselwortargumente sind in Ruby 3.0 zu trennen. Dies ist nur eine Warnung. Schienen sind mit diesem Muster gefüllt. ruby-lang.org/en/news/2019/12/12/…
Josh Brody
3
@ JoshBrody vielen Dank. Ich habe diesen Link gesehen und es gibt einige Vorschläge zum Wechseln von Warnungen wie "Wenn Sie die Verfallswarnungen deaktivieren möchten, verwenden Sie bitte ein Befehlszeilenargument -W: no-veraltet oder fügen Sie Ihrem Code Warnung [: veraltet] = false hinzu. "" aber ich dachte an eine etwas bessere Lösung / Korrektur für Actionpack v6.0.2.1
Nezir
Das Verbergen von Verfallswarnungen auf der ganzen Linie ist eine schlechte Idee, insbesondere wenn Sie Ihre zukünftigen Upgrades glätten möchten.
Vlad
1
@Vlad stimmte zu, aber die vorübergehende Reduzierung des Holzrauschens ist in Ordnung (wenn Sie wissen, was Sie tun)
Khalil Gharbaoui

Antworten:

54

So unterdrücken Sie Warnungen wie:

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

Im Moment müssen Sie die RUBYOPTUmgebungsvariable einfach Ihren Rails-Befehlen voranstellen / übergeben :

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

Dies funktioniert möglicherweise nicht mit früheren Versionen von Ruby.

Aus Gründen der Abwärtskompatibilität mit früheren Versionen von Ruby wird RUBYOPT='-W0'stattdessen das Präfix verwendet.

Beispiel:

RUBYOPT='-W0' bundle exec rspec

Wenn Sie dies nicht jedes Mal voranstellen möchten, wenn Sie einen Befehl ausführen, fügen Sie dies einfach in die letzte Zeile Ihres .zshrcoder .bashrc(was auch immer Sie verwenden) ein:

export RUBYOPT='-W:no-deprecated -W:no-experimental'
oder
export RUBYOPT='-W0'

Siehe auch den letzten Punkt der Notizen hier:
https://rubyreferences.github.io/rubychanges/2.7.html#warning-and-

Khalil Gharbaoui
quelle
1
Ein Problem dabei ist, dass installierte frühere Versionen von Ruby, bei denen das Flag -W: no-veraltet 'ungültig ist, einen Fehler auslösen. Ich habe dies durch Exportieren behoben. RUBYOPT = '- W0'
Augusto Samamé Barrientos
Gibt es eine Möglichkeit, die Aufgabe aufzurufen, die keine Warnung ausgibt, dh sie auf eine Weise aufzurufen, die nicht veraltet ist?
Barlop
@barlop Nun, es ist nicht die Aufgabe, die die Warnung gibt. Die Warnungen stammen aus dem zugrunde liegenden Code. Grundsätzlich reicht es aus, die Abschreibungen zu finden, wenn sie in Ihrem eigenen Code enthalten sind, und sie zu beheben. Und wenn sie nicht Teil Ihres Codes sind, öffnen Sie Probleme oder ziehen Sie Anfragen zu den Repos der Edelsteine, die Sie einschließen, und bitten Sie sie um eine Lösung. oder warten Sie einfach, bis sie das Problem behoben haben. Einige Abwertungen werden hier erwähnt: ruby-lang.org/en/news/2019/12/25/ruby-2-7-0- veröffentlicht und hier: rubyreferences.github.io/rubychanges/2.7.html
Khalil Gharbaoui
@ KhalilGharbaoui Danke. Ich habe gerade did.a frisch insall von Ruby und Rails iirc pastebin.com/SYjypsrP sieht aus wie ich die neueste jeder haben und alles , was ich tat , war ein leeres Projekt, versucht Rake Hilfe und bekam die Warnung auch mit Schienen erstellt db: migrate. Ich denke, ich sollte auf diese Repos gehen. Rechen über Erwähnungen Actionpack. Rake DB: Migrieren oder Rails DB: Migrieren erwähnt Actionpack, Activerecord, Activemodel. Obwohl einige von denen, die in Schienen beheimatet sind, nicht so seltsam sind, dass die Schienenleute es nicht richtig machen konnten.
Barlop
5

Offensichtlich wird es einige Zeit dauern, bis das Ruby-Team diese Warnung in der nächsten Ruby-Version entfernt hat. Vorerst der Befehl in Ihrem Terminal

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

Entfernen Sie in meinem einfachen Projekt 6.0.2.1 && ruby ​​2.7.0 diese beiden Warnzeilen oben in einer Frage.

Auch mit Befehl

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

Sie werden Warnungen zu experimentellen Funktionen ausblenden.

Sie können diese beiden in einem Befehl wie folgt kombinieren:

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

Ich habe diese Befehle jedoch in meinem alten Projekt ausprobiert, das mit Rails 5.2 und Ruby 2.6.4 erstellt wurde und später auf Rails 6.0.1 aktualisiert wurde. Sie funktionierten nicht für alle Warnmeldungen, die ich von verschiedenen Rails Active * -Modulen und Ruby Gems erhalten habe.

Wahrscheinlich werden wir etwas Zeit brauchen, um Code und Edelsteine ​​für neue neueste Sachen zu aktualisieren.

Nezir
quelle
5

Da es nur eine Warnung ist und nichts beeinflusst. Sie können sie einfach unterdrücken. Ich fand Lösung 2 passend für mich.

Option 1. Starten Sie den Rails-Server mit RUBYOPT='-W:no-deprecated' rails s

Option 2. Legen Sie export RUBYOPT='-W:no-deprecatedin Ihrem Bash / Zsh-Profil fest

Option 3. Geben Sie Warning[:deprecated] = falseIhren Ruby-Code ein

Sajidur Rahman
quelle