Ho fatto un po’ di sviluppo Java recentemente, e i miei editor preferiti rimbalzano tra Visual Studio Code e Neovim. La mia configurazione di vim è configurata per formattare i file sorgente Java usando google-java-format, ma stavo lottando per ottenere lo stesso comportamento in Visual Studio Code. Questo post esplora come formattare i file sorgente Java usando google-java-format in VS Code.
TL;DR
Installa emeraldwalk/vscode-runonsave:
$ code --install-extension emeraldwalk.RunOnSave
Installa google-java-format per il tuo sistema:
# Example using Homebrew on OS X$ brew install google-java-format
Configura RunOnSave nelle impostazioni di Visual Studio Code:
{ "emeraldwalk.runonsave": { "commands": , },}
Sfondo
Google pubblica una verbosa guida di stile Google Java così come google-java-format che riformatta il codice Java secondo quella guida di stile. Il formattatore è disponibile come JAR Java e tramite i più diffusi gestori di pacchetti. Per esempio, per installare il formattatore su OS X:
$ brew install google-java-format
Poi, per formattare i file sorgente Java, passarli come argomenti al comando:
$ google-java-format -i ./MyClass.java
Lavoro esistente
Ci sono già plugin popolari per google-java-format per IDE come Eclipse e IntelliJ. Sfortunatamente non ne esistono di ufficiali per Visual Studio Code al momento di questo scritto. Prima di arrivare alla mia soluzione, ho fatto qualche ricerca su Internet.
La risposta più popolare viene da redhat-developer/vscode-java#419 che ci indirizza a una pagina Wiki con le istruzioni per modificare alcune configurazioni di Visual Studio Code:
{ "java.format.settings.profile": "GoogleStyle", "java.format.settings.url": "https://raw.githubusercontent.com/google/styleguide/gh-pages/eclipse-java-google-style.xml",}
Questo istruirà l’editor a usare il “GoogleStyle” quando formatta il codice invece dello stile integrato. Questo sembra un’ottima soluzione, dato che sto già usando il Java Language Support di RedHat.
Mentre questo cambia il formato predefinito del codice, nei miei test non corrisponde all’output dell’esecuzione di google-java-format
direttamente dalla linea di comando. Peggio, ha modificato cose come le intestazioni di licenza, rendendole non valide.
Mi sono anche imbattuto in Dev-Snippets/vscode-google-java-format-provider, che sembrava promettente, ma non sono riuscito a farlo registrare come formattatore (e non sono l’unico).
Soluzione
Ho iniziato a scrivere il mio plugin di Visual Studio Code per eseguire google-java-format
come formattatore. Dopo circa 10 minuti di esercizio, mi sono reso conto che questo plugin sarebbe stato abbastanza stupido:
- Rileva se il file è Java
- Esegui
google-java-format -i ${file}
- Riporta eventuali errori all’utente
Questi passi sono essenzialmente “eseguire un comando al salvataggio”, e risulta che qualcuno ha già scritto una estensione! emeraldwalk/vscode-runonsave legge le impostazioni di Visual Studio Code, abbina i file su un’espressione regolare e poi esegue un comando fornito dall’utente. Questa si è rivelata una soluzione minima ma perfetta!
Ho installato RunOnSave e google-java-format
sul mio Mac:
$ code --install-extension emeraldwalk.RunOnSave$ brew install google-java-format
Poi ho configurato RunOnSave per eseguire google-java-format
sui file che finiscono in .java
nelle impostazioni di Visual Studio Code:
{ "emeraldwalk.runonsave": { "commands": , },}
Questo richiede che google-java-format
sia nel mio $PATH
. Se non lo fosse, potrei invece specificare il percorso completo del binario:
{ "cmd": "/usr/local/bin/google-java-format --replace ${file}"}
Dopo aver passato alcune ore a cercare di raggiungere la parità tra google-java-format e il formatOnSave
di Visual Studio Code, sento di aver raggiunto una soluzione perfetta.