Brug af google-java-format med VS Code

Jeg har lavet en del Java-udvikling for nylig, og mine foretrukne redigeringsprogrammer svinger mellem Visual Studio Code og Neovim. Min vim-opsætning er konfigureret til at formatere Java-kildefiler ved hjælp af google-java-format, men jeg kæmpede for at opnå den samme adfærd i Visual Studio Code. Dette indlæg undersøger, hvordan man kan formatere Java-kildefiler ved hjælp af google-java-format i VS Code.

TL;DR

Installer emeraldwalk/vscode-runonsave:

$ code --install-extension emeraldwalk.RunOnSave

Installer google-java-format til dit system:

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

Konfigurer RunOnSave i Visual Studio Code-indstillingerne:

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

Baggrund

Google udgiver en udførlig Google Java-stilguide samt google-java-format, der omformaterer Java-kode i henhold til denne stilguide. Formateren er tilgængelig som en Java JAR og via populære pakkehåndteringsprogrammer. For eksempel for at installere formatteren på OS X:

$ brew install google-java-format

For at formatere Java-kildefiler skal du derefter sende dem som argumenter til kommandoen:

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

Eksisterende arbejde

Der findes allerede populære plugins til google-java-format til IDE’er som Eclipse og IntelliJ. Desværre findes der i skrivende stund ingen officielle til Visual Studio Code. Inden jeg kom med min egen løsning, søgte jeg lidt på internettet.

Det mest populære svar kommer fra redhat-developer/vscode-java#419, som henviser os til en Wiki-side med instruktioner om at redigere noget Visual Studio Code-konfiguration:

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

Dette vil instruere editoren til at bruge “GoogleStyle”, når den formaterer kode i stedet for den indbyggede stil. Dette virkede som et godt match, da jeg allerede bruger RedHats Java Language Support.

Mens dette ændrer standardformatet for koden, stemte det i min test ikke overens med resultatet af at køre google-java-format direkte fra kommandolinjen. Værre var det, at den ændrede ting som licensheadere, hvilket gjorde dem ugyldige.

Jeg faldt også over Dev-Snippets/vscode-google-java-format-provider, som virkede lovende, men jeg kunne ikke få den til at registrere sig som formatter (og jeg er ikke den eneste).

Løsning

Jeg begyndte at skrive mit eget Visual Studio Code-plugin til at køre google-java-format som en formatter. Efter ca. 10 minutter inde i øvelsen indså jeg, at dette plugin ville blive ret dumt:

  1. Detekterer, om filen er Java
  2. Kør google-java-format -i ${file}
  3. Rapportere eventuelle fejl tilbage til brugeren

Disse trin er i bund og grund “kør en kommando ved lagring”, og det viser sig, at nogen allerede har skrevet en udvidelse! emeraldwalk/vscode-runonsave læser indstillingerne for Visual Studio Code, matcher filer på et regulært udtryk og kører derefter en kommando, der er leveret af brugeren. Dette viste sig at være en minimal, men perfekt løsning!

Jeg installerede RunOnSave og google-java-format på min Mac:

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

Derpå konfigurerede jeg RunOnSave til at køre google-java-format på filer, der ender på .java i Visual Studio Code-indstillingerne:

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

Dette kræver, at google-java-format skal være i min $PATH. Hvis det ikke var det, kunne jeg angive den fulde sti til binærfilen i stedet:

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

Efter at have brugt et par timer på at forsøge at opnå paritet mellem google-java-format og Visual Studio Code’s formatOnSave, føler jeg, at jeg er nået frem til en perfekt løsning.