[RUBY] [Rails] Profitieren Sie mit minimalem Aufwand von Rubocop

Einführung

Es war wie ein Spruch eingeprägt: "Wenn Sie ein Rails-Projekt durchführen, lassen Sie uns Rubocop einsetzen", aber tatsächlich verstand ich nicht genau, was Rubocop kann und welche Vorteile es hat, also habe ich es zusammengefasst.

Das Wichtigste, das Sie bei der Verwendung dieser Art von "Werkzeug, das verschiedene Dinge tun kann" beachten sollten, ist, nicht alle bereitgestellten Funktionen zu erfassen und alle zu verwenden, sondern etwa 80% zu minimieren, die den Zweck der Einführung erfüllen. Ich denke, es ist wichtig, dies mit der Anstrengung von tun zu können.

Es wäre großartig, wenn Sie diesen Artikel lesen und das Ergebnis erhalten könnten, nicht nur Rubocop einzuführen, sondern auch die Qualität des Codes ohne Aufwand zu verbessern (= sich auf die Logik und Tests zu konzentrieren, die geschrieben werden sollten). ..

Was ist Rubocop?

Kurz gesagt, es ist ein Tool, das den Code in Ruby (.rb-Datei) überprüft und erkennt, wo er gegen die Regeln verstößt.

Dies verbessert nicht nur die Lesbarkeit des Codes, z. B. "Der Code ist zu lang" und "Der Inden ist nicht geeignet", sondern führt auch zu Fehlern wie "Es gibt keine Optionen zur Klärung" und "DB und Modell sind inkonsistent". Es erkennt auch Verstöße gegen solche Regeln. In vielen Fällen wird es automatisch behoben.

Wenn Sie Schienen verwenden und gleichzeitig Rubocop-Schienen verwenden, werden auch schienenspezifische Dateien (z. B. Migrationsdatei, Einstellungsdatei) überprüft.

verdienen

Ich denke, die Vorteile, die durch die Einführung von Rubocop erzielt werden können, sind folgende.

Wie benutzt man Rubocop?

Wir werden die Einführung und Verwendung bei der Verwendung von Schienen beschreiben.

Die Umgebung, die ich ausprobiert habe, ist wie folgt.

In meinem Fall gab es auch eine Rails-App, die ich mit Priorität erstellt habe, und ich habe sie mit ungefähr 5 oder 6 erstellten Modellen und Steuerungen eingeführt.

Außerdem habe ich bei der Einführung Folgendes beachtet. Ich denke also, dass es Teile gibt, die sich von den Einstellungsinhalten und inkompatiblen Teilen sowie der von anderen Personen beschriebenen Einführungsmethode unterscheiden.

――Streben Sie nicht plötzlich 100% an —— Überlassen Sie die Arbeit des Werkzeugs dem Werkzeug und konzentrieren Sie sich auf das, was Sie tun müssen

Installation & Konfiguration

Nehmen Sie die folgende Beschreibung in der Gemfile- und Bundle-Installation vor

group :development do
  gem 'rubocop', require: false
  gem 'rubocop-rails'
end

Überprüfen Sie vorerst

$ rubocop
Inspecting 57 files
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

Offenses:
57 files inspected, 292 offenses detected, 260 offenses auto-correctable

292 Teile wurden durcheinander gebracht ... Selbst wenn ich drückte, konnte ich nicht alle Orz anzeigen

Überprüfen Sie dies nacheinander und korrigieren Sie es. Wie geht's? Ich mache kein Rubocop mehr! Es wird weggeworfen, also machen wir es zu einem nützlichen Werkzeug, das kontinuierlich verwendet werden kann.

Aus diesem Grund führen wir die folgenden Schritte aus: "Einstellungsdatei erstellen" und "Automatische Korrektur".

Konfigurationsdatei erstellen

Wenn Sie den folgenden Befehl ausführen, wird eine Einstellungsdatei (.rubocop.yml) erstellt und die Einstellung zum Überspringen der erkannten Konventionsverletzung in ( .rubocop_todo.yml) beschrieben. ..

$ rubocop --auto-gen-config

Ich werde die Regeln und den Umfang, die angewendet werden sollen (nicht angewendet), in die Einstellungsdatei schreiben.

Vorerst habe ich versucht, die folgenden Einstellungen vorzunehmen, um "das Prüfziel auf den von mir geschriebenen Code zu beschränken".

AllCops:
  TargetRubyVersion: 2.6
  NewCops: enable    #← Beurteilung, ob bei der Registrierung einer neuen Vereinbarung ein Antrag gestellt werden soll
  Exclude:
    - 'bin/**'
    - 'node_modules/**/*'
    - 'config/**/*'
    - 'config.ru'
    - 'db/schema.rb'
    - 'db/seeds.rb'
    - 'Gemfile'
#Kommentare auf Japanisch zulassen
Style/AsciiComments:
  Enabled: false

#Ignorieren Sie die Anforderungen für Klassenkommentare
Style/Documentation:
  Enabled: false

# 「frozen_string_literal:Fügen Sie nicht "true" hinzu
Style/FrozenStringLiteralComment:
  Enabled: false

#Die Anzahl der Zeilen in der Methode ist bis zu 10 Zeilen zu streng. Ändern Sie sie daher in 20 Zeilen
Metrics/MethodLength:
  Max: 20

# private/geschützte Einschnitte tiefer
Style/IndentationConsistency:
  EnforcedStyle: indented_internal_methods

Kommentieren Sie nach der Beschreibung dieser Einstellungsdateien den Inhalt der Datei (.rubocop_todo.yml) aus, die den Verstoß gegen die Regeln gespeichert hat, und führen Sie rubocop erneut aus. In meinem Fall ist es auf ungefähr 50 gesunken.

Zu diesem Zeitpunkt habe ich immer noch keine Lust, alles einzeln zu reparieren, daher führe ich die folgende automatische Korrektur durch.

Automatische Korrektur

Wie eingangs erwähnt, werden einfache (und eindeutige) Verstöße gegen die Konvention automatisch mit dem Befehl rubocop -a behoben.

Bei dieser Ausführung erhalten die automatisch korrigierten Regelverstöße "[Korrigiert]", und schließlich wird die Anzahl der automatisch korrigierten Regeln für die Gesamtzahl der Regelverstöße angezeigt.

$ rubocop -a
.rubocop.yml: Style/IndentationConsistency has the wrong namespace - should be Layout
Inspecting 29 files
....................CC.CCCCCC

Offenses:

db/migrate/20200928124523_devise_create_users.rb:6:59: C: [Corrected] Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.
      t.string :nickname,           null: false, default: ""
                                                          ^^

~Unterwegs weggelassen ~

29 files inspected, 24 offenses detected, 22 offenses corrected

Manuelle Korrektur

Und der Verstoß gegen die Regeln, der auch nach der automatischen Korrektur bestehen bleibt, muss von Ihnen selbst behoben werden (= ** die Arbeit, die ich ursprünglich machen wollte, nehmen Sie sich Zeit, um den Inhalt zu verstehen und korrigieren Sie ihn auf den Code, der sein sollte **). ist.

In meinem Fall blieben die folgenden zwei übrig. Ich denke, dies ist ein Verstoß gegen die Regeln, die zu Fehlern führen können. Überprüfen Sie daher den Inhalt des Fehlers (z. B. wenn Sie mit dem Schlüsselwort "Rails / HasManyOrHasOneDependent" googeln, finden Sie ihn im Inhalt der offiziellen Website oder im höflichen Kommentarartikel). Ich untersuchte die Korrekturmethode, korrigierte sie und ließ erneut rubocop laufen, und es war sicher, gegen die Regeln zu verstoßen.

# has_Abhängige Option für viele Verbände(Löschen Sie den übergeordneten Datensatz gleichzeitig? verlassen? Fehler machen? Geben Sie eine Warnung? ) Ist nicht eingestellt
app/models/category.rb:3:3: C: Rails/HasManyOrHasOneDependent: Specify a :dependent option.
  has_many :estimate_details
  ^^^^^^^^

#Die eindeutige Validierung ist im Modell definiert, die eindeutige Validierung ist jedoch nicht in der DB-Definition definiert
app/models/category.rb:6:3: C: Rails/UniqueValidationWithoutIndex: Uniqueness validation should be with a unique index.
  validates :user_id, uniqueness: { scope: :category_name }

Automatische Ausführung

Es ist ein nützliches Tool, aber vergessen Sie nicht, es zuerst auszuführen. Lassen Sie es uns also automatisch ausführen, wenn etwas passiert. Ich denke, das beste Timing ist das Commit-Timing, daher werde ich ein Juwel namens Pre-Commit einführen, damit es automatisch ausgeführt wird, wenn der Befehl git commit ausgegeben wird.

Setzen Sie "gem pre-commit" auf Gemfile und generieren Sie nach "bundle install" eine Pre-Commit-Datei mit dem folgenden Befehl.

$ pre-commit install
Installed /Users/hiro/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/pre-commit-0.39.0/templates/hooks/automatic to .git/hooks/pre-commit

Stellen Sie den folgenden Befehl ein, um Rubocop zum Zeitpunkt des Festschreibens automatisch auszuführen.

#Überprüfen Sie den Status vor dem Einstellen
$ pre-commit list    
Available providers: default(0) git(10) git_old(11) yaml(20) env(30)
Available checks   : before_all ci coffeelint common console_log csslint debugger gemfile_path go go_build go_fmt jshint jslint json local merge_conflict migration nb_space pry rails rspec_focus rubocop ruby ruby_symbol_hashrockets scss_lint tabs whitespace yaml
Default   checks   : common rails
Enabled   checks   : common rails
Evaluated checks   : tabs nb_space whitespace merge_conflict debugger pry local jshint console_log migration
Default   warnings : 
Enabled   warnings : 
Evaluated warnings :

#Stellen Sie ein, dass Rubocop zum Zeitpunkt des Git-Commits ausgeführt wird
$ git config pre-commit.checks rubocop

#Überprüfen Sie den Status nach dem Einstellen
$ pre-commit list    
Available providers: default(0) git(10) git_old(11) yaml(20) env(30)
Available checks   : before_all ci coffeelint common console_log csslint debugger gemfile_path go go_build go_fmt jshint jslint json local merge_conflict migration nb_space pry rails rspec_focus rubocop ruby ruby_symbol_hashrockets scss_lint tabs whitespace yaml
Default   checks   : rubocop   #← Rubocop ist eingestellt
Enabled   checks   : rubocop   #← Rubocop ist eingestellt
Evaluated checks   : rubocop   #← Rubocop ist eingestellt
Default   warnings : 
Enabled   warnings : 
Evaluated warnings :

Wenn Sie pre-commti via Bundle verwenden, müssen Sie die Einstellungsdatei (.git / hooks / pre-commit) unter .git wie folgt ändern.

#!/usr/bin/env sh

~ Ausgelassen ~

PATH=$PATH:/usr/local/bin:/usr/local/sbin

cmd=`git config pre-commit.ruby 2>/dev/null`
if   test -n "${cmd}"
then true
elif which rvm   >/dev/null 2>/dev/null
then cmd="rvm default do ruby"
elif which rbenv >/dev/null 2>/dev/null
then cmd="rbenv exec ruby"  #← Vor der Korrektur
then cmd="rbenv exec bundle exec ruby"  #← Nach der Korrektur
else cmd="ruby"
fi

~ Ausgelassen ~

Führen Sie nach Abschluss der Einstellungen den Befehl git commit aus und prüfen Sie, ob rubocop automatisch ausgeführt wird.

(Der Zeilenendrand wurde im Voraus vorbereitet, damit die Regeln verletzt werden.)

$ git commit
pre-commit: Stopping commit because of errors.
Inspecting 1 file
C

Offenses:

app/controllers/home_controller.rb:4:1: C: Layout/TrailingWhitespace: Trailing whitespace detected.

1 file inspected, 1 offense detected, 1 offense auto-correctable
.rubocop.yml: Style/IndentationConsistency has the wrong namespace - should be Layout

pre-commit: You can bypass this check using `git commit -n`

Ich konnte bestätigen, dass Rubocop zum Zeitpunkt des Commits automatisch ausgeführt wird. Wenn ein Verstoß festgestellt wird, wird der Festschreibungsprozess unterbrochen.

Als Ablauf nach der Erkennung denke ich, dass dies der Ablauf der "Bestätigung des Verstoßinhalts" → (falls korrigiert werden sollte) "manuelle oder automatische Korrektur ( rubocop -a) "→" In Staging-Umgebung registrieren "→" Festschreiben "sein wird. Ich werde.

abschließend

In Zukunft wird rubocop automatisch für das Festschreiben ausgeführt. Es kann so eingestellt werden, dass es überprüft wird und kontinuierlich verwendet wird. Wenn Sie Code schreiben und die Einstellungsdatei überprüfen oder den Inhalt überprüfen und den Schreibstil ändern können, wenn ein neuer Regelverstoß auftritt, können Sie meines Erachtens ein besseres und ein eigenes Tool entwickeln Ich denke, dass dies zu einer Verbesserung der Codequalität führen kann.

Artikel, die ich als Referenz verwendet habe

Ich war völlig unwissend, wie man es benutzt, also war es sehr hilfreich. Wir möchten diese Gelegenheit nutzen, um den Autoren des Artikels zu danken.

Recommended Posts

[Rails] Profitieren Sie mit minimalem Aufwand von Rubocop
Ich möchte mit Firestore von Rails spielen
[Rails 6] Laufzeitfehler mit $ Rails s
Gerät mit Schienen handhaben
[Rails] Lernen mit Rails Tutorial
[Schienen] Test mit RSpec
[Rails] Entwicklung mit MySQL
Unterstützt Mehrsprachigkeit mit Rails!
Cloud9 (Rails) von Github
[Rails] Suche aus mehreren Spalten + Bedingungen mit Gem und Ransack