Verwendung von google-java-format mit VS Code

Ich habe in letzter Zeit einige Java-Entwicklungen durchgeführt, und meine bevorzugten Editoren schwanken zwischen Visual Studio Code und Neovim. Mein Vim ist so konfiguriert, dass er Java-Quelldateien mit google-java-format formatiert, aber ich hatte Schwierigkeiten, das gleiche Verhalten in Visual Studio Code zu erreichen. Dieser Beitrag untersucht, wie man Java-Quelldateien mit google-java-format in VS Code formatiert.

TL;DR

Installieren Sie emeraldwalk/vscode-runonsave:

$ code --install-extension emeraldwalk.RunOnSave

Installieren Sie google-java-format für Ihr System:

# Example using Homebrew on OS X$ brew install google-java-format

Konfigurieren Sie RunOnSave in den Visual Studio Code Einstellungen:

{ "emeraldwalk.runonsave": { "commands": , },}

Hintergrund

Google veröffentlicht einen ausführlichen Google-Java-Style-Guide sowie google-java-format, das Java-Code gemäß diesem Style-Guide neu formatiert. Der Formatter ist als Java-JAR und über gängige Paketmanager verfügbar. Um den Formatter beispielsweise unter OS X zu installieren:

$ brew install google-java-format

Um Java-Quelldateien zu formatieren, übergeben Sie sie als Argumente an den Befehl:

$ google-java-format -i ./MyClass.java

Bestehende Arbeit

Es gibt bereits populäre Plugins für google-java-format für IDEs wie Eclipse und IntelliJ. Leider gibt es zum Zeitpunkt der Erstellung dieses Artikels keine offiziellen für Visual Studio Code. Bevor ich meine eigene Lösung gefunden habe, habe ich im Internet recherchiert.

Die populärste Antwort kommt von redhat-developer/vscode-java#419, die uns auf eine Wiki-Seite mit Anweisungen zum Bearbeiten einiger Visual Studio Code-Konfigurationen verweist:

{ "java.format.settings.profile": "GoogleStyle", "java.format.settings.url": "https://raw.githubusercontent.com/google/styleguide/gh-pages/eclipse-java-google-style.xml",}

Dadurch wird der Editor angewiesen, bei der Formatierung von Code den „GoogleStyle“ anstelle des integrierten Stils zu verwenden. Das schien mir sehr passend zu sein, da ich bereits RedHats Java Language Support verwende.

Dies ändert zwar das Standardformat des Codes, aber in meinen Tests stimmte es nicht mit der Ausgabe überein, wenn man google-java-format direkt von der Befehlszeile aus ausführt. Schlimmer noch, es änderte Dinge wie Lizenz-Header und machte sie ungültig.

Ich stolperte auch über Dev-Snippets/vscode-google-java-format-provider, das vielversprechend schien, aber ich konnte es nicht dazu bringen, sich als Formatierer zu registrieren (und ich bin nicht der Einzige).

Lösung

Ich machte mich auf den Weg, mein eigenes Visual Studio Code-Plugin zu schreiben, um google-java-format als Formatierer auszuführen. Nach etwa 10 Minuten wurde mir klar, dass dieses Plugin ziemlich dumm sein würde:

  1. Erkennen, ob die Datei Java ist
  2. Ausführen google-java-format -i ${file}
  3. Fehler an den Benutzer zurückmelden

Diese Schritte sind im Wesentlichen „einen Befehl beim Speichern ausführen“, und es stellte sich heraus, dass jemand bereits eine Erweiterung geschrieben hat! emeraldwalk/vscode-runonsave liest die Einstellungen von Visual Studio Code, gleicht Dateien mit einem regulären Ausdruck ab und führt dann einen vom Benutzer eingegebenen Befehl aus. Dies erwies sich als minimale, aber perfekte Lösung!

Ich installierte RunOnSave und google-java-format auf meinem Mac:

$ code --install-extension emeraldwalk.RunOnSave$ brew install google-java-format

Dann konfigurierte ich RunOnSave so, dass es google-java-format auf Dateien ausführt, die in den Visual Studio Code-Einstellungen auf .java enden:

{ "emeraldwalk.runonsave": { "commands": , },}

Dies erfordert, dass google-java-format in meinem $PATH enthalten ist. Wäre dies nicht der Fall, könnte ich stattdessen den vollständigen Pfad zur Binärdatei angeben:

{ "cmd": "/usr/local/bin/google-java-format --replace ${file}"}

Nachdem ich einige Stunden damit verbracht habe, die Gleichheit zwischen dem Google-Java-Format und dem formatOnSave von Visual Studio Code herzustellen, habe ich das Gefühl, eine perfekte Lösung gefunden zu haben.