Jak naprawić komunikaty ostrzegawcze Railsów w Ruby 2.7.0

43

Czy ktoś rozwiązał ten problem Ruby 2.7.0?

Użyłem rbenvi zainstalowałem Ruby v2.7.0, a następnie utworzyłem projekt Rails przy użyciu Rails v6.0.2.1.

Obecnie, prowadząc jeden z

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

serwer jest uruchomiony i witryna jest obsługiwana, ale w Consoledzienniku widzę dwa komunikaty ostrzegawcze:

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 

Tak więc komunikaty ostrzegawcze to:

**.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
źródło
8
Argumenty pozycyjne i argumenty słów kluczowych należy rozdzielić w Ruby 3.0. To tylko ostrzeżenie. Szyny są wypełnione tym wzorem. ruby-lang.org/en/news/2019/12/12/…
Josh Brody
3
@JoshBrody bardzo dziękuję. Widziałem ten link i pojawiły się sugestie dotyczące zmiany ostrzeżeń, np. „Jeśli chcesz wyłączyć ostrzeżenia o wycofaniu, użyj argumentu wiersza polecenia -W: no-przestarzałe lub dodaj Ostrzeżenie [: przestarzałe] = false do swojego kodu. „ ale myślałem o nieco lepszym rozwiązaniem / fix dla actionpack v6.0.2.1
Nezir
Ukrywanie ostrzeżeń o wycofaniu na całym forum jest ZŁYM pomysłem, szczególnie gdy chcesz wygładzić przyszłe aktualizacje.
Vlad
1
@Vlad zgodził się, ale tymczasowe ograniczenie hałasu dziennika jest w porządku (jeśli wiesz, co robisz)
Khalil Gharbaoui

Odpowiedzi:

54

Aby ukryć ostrzeżenia, takie jak:

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

Na razie po prostu prefiks / przekaż RUBYOPTzmienną środowiskową do komend railsowych:

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

To może nie działać z wcześniejszymi wersjami Ruby.

Dla kompatybilności wstecznej z wcześniejszymi wersjami Ruby prefiks go RUBYOPT='-W0'zamiast.

przykład:

RUBYOPT='-W0' bundle exec rspec

Jeśli nie chcesz tego prefiksować za każdym razem, gdy uruchamiasz polecenie, po prostu dodaj to do ostatniego wiersza .zshrclub .bashrc(cokolwiek używasz):

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

Zobacz także ostatni punkt uwag tutaj:
https://rubyreferences.github.io/rubychanges/2.7.html#warning-and-

Khalil Gharbaoui
źródło
1
Jednym z problemów jest to, że zainstalowane poprzednie wersje Ruby, w których niepoprawna jest opcja -W: no-przestarzała, spowoduje zgłoszenie błędu. Naprawiłem to za pomocą eksportu RUBYOPT = '- W0'
Augusto Samamé Barrientos
Czy istnieje sposób na wywołanie zadania, które nie daje ostrzeżenia, tj. Wywołanie go w sposób, który nie jest przestarzały?
barlop
@barlop cóż, to nie jest ostrzeżenie. Ostrzeżenia pochodzą z podstawowego kodu. Zasadniczo znalezienie przestarzałości, jeśli są we własnym kodzie, i ich naprawienie wystarczy. A jeśli nie są częścią twojego kodu, otwórz problemy lub ściągnij prośby o repozytorium zawartych w nim klejnotów i poproś o naprawę. lub po prostu poczekaj, aż to naprawią. Niektóre przestarzałe są wymienione tutaj: ruby-lang.org/en/news/2019/12/25/ruby-2-7-0-released i tutaj: rubyreferences.github.io/rubychanges/2.7.html
Khalil Gharbaoui
@KhalilGharbaoui Thanks. Właśnie to zrobiłem. Świeża kolekcja ruby ​​i szyn iirc pastebin.com/SYjypsrP wygląda na to, że mam najnowszą wersję i wszystko, co zrobiłem, to stworzenie pustego projektu, wypróbowanie pomocy rake i otrzymanie ostrzeżenia również z szynami db: migracja. Chyba powinienem pójść na te repozytoria. rake about wspomina o pakiecie akcji. rake db: migracja lub railsy db: migracja wspomina actionpack, activerecord, activemodel. Chociaż niektórzy z nich nie są nawet ojczystymi szynami, tak dziwnymi, że ludzie nie mogli tego zrobić poprawnie.
barlop
5

Oczywiście minie trochę czasu, zanim zespół ruby ​​usunie to ostrzeżenie w następnej wersji ruby. Na razie polecenie w twoim terminalu

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

na moim podstawowym, prostym nowym projekcie szyn 6.0.2.1 i& Ruby 2.7.0 usuwam powyższe dwa wiersze ostrzeżeń w pytaniu.

Również z poleceniem

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

ukryjesz ostrzeżenia o funkcjach eksperymentalnych.

Możesz połączyć te dwa w jednym poleceniu, takim jak:

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

Jednak wypróbowałem te polecenia w moim starym projekcie zbudowanym z szyn 5.2 i Ruby 2.6.4 później zaktualizowanym do szyn 6.0.1 i nie działały one dobrze dla wszystkich komunikatów ostrzegawczych, które otrzymałem z różnych modułów Active * i rubinowych klejnotów.

Prawdopodobnie potrzebujemy trochę czasu na aktualizację kodu i klejnotów do nowych najnowszych rzeczy.

Nezir
źródło
5

Jest to tylko ostrzeżenie i nie wpłynie na nic. Możesz po prostu je stłumić. Uważam, że rozwiązanie 2 jest dla mnie odpowiednie.

Opcja 1. Uruchom serwer szyn za pomocą RUBYOPT='-W:no-deprecated' rails s

Opcja 2. Ustaw export RUBYOPT='-W:no-deprecatedw swoim profilu bash / zsh

Opcja 3. Ustaw Warning[:deprecated] = falsew swoim kodzie ruby

Sajidur Rahman
źródło