Olen viime aikoina tehnyt Java-kehitystä, ja suosimani editorit pomppivat Visual Studio Code ja Neovim välillä. Minun vim-asetelmani on konfiguroitu muotoilemaan Java-lähdetiedostot google-java-formatilla, mutta minulla oli vaikeuksia saavuttaa sama käyttäytyminen Visual Studio Codessa. Tässä postauksessa selvitetään, miten Java-lähdetiedostot voidaan muotoilla google-java-formatilla VS Codessa.
TL;DR
Asenna emeraldwalk/vscode-runonsave:
$ code --install-extension emeraldwalk.RunOnSave
Asenna google-java-format järjestelmääsi:
# Example using Homebrew on OS X$ brew install google-java-format
Konfiguroi RunOnSave-formaatti Visual Studio Koodin asetuksissa:
{ "emeraldwalk.runonsave": { "commands": , },}
Tausta
Google julkaisee sanallisen Google Java -tyylioppaan sekä google-java-format, joka muotoilee Java-koodin uudelleen kyseisen tyylioppaan mukaisesti. Muotoilija on saatavana Java JAR:nä ja suosittujen paketinhallintaohjelmien kautta. Asenna formatteri esimerkiksi OS X:lle:
$ brew install google-java-format
Javan lähdetiedostojen muotoilemiseksi anna ne argumentteina komennolle:
$ google-java-format -i ./MyClass.java
Olemassaoleva työ
Google-java-formatille on jo olemassa suosittuja liitännäisiä (plugins) IDE-ohjelmille, kuten Eclipselle ja IntelliJille. Valitettavasti mitään virallisia ei ole olemassa Visual Studio Codelle tätä kirjoitettaessa. Ennen kuin keksin oman ratkaisuni, tein hieman Internet-etsintää.
Suosituin vastaus tulee redhat-developer/vscode-java#419:stä, joka ohjaa Wiki-sivulle, jossa on ohjeet joidenkin Visual Studio Code -konfiguraatioiden muokkaamiseen:
{ "java.format.settings.profile": "GoogleStyle", "java.format.settings.url": "https://raw.githubusercontent.com/google/styleguide/gh-pages/eclipse-java-google-style.xml",}
Tämä ohjeistaa editorin käyttämään ”GoogleStyle”-tyyliä koodin muotoilussa sisäänrakennetun tyylin sijaan. Tämä tuntui sopivan hyvin, koska käytän jo RedHatin Java-kielitukea.
Vaikka tämä muuttaa koodin oletusmuotoilua, testauksessani se ei vastannut suoraan komentoriviltä ajetun google-java-format
tulostetta. Vielä pahempaa oli, että se muutti esimerkiksi lisenssiotsikoiden kaltaisia asioita, jolloin ne eivät olleet päteviä.
Törmäsin myös Dev-Snippets/vscode-google-java-format-provideriin, joka vaikutti lupaavalta, mutta en saanut sitä rekisteröitymään formatoijaksi (enkä ole ainoa).
Ratkaisu
Aloitin kirjoittamaan oman Visual Studio Code -liitännäiseni, jonka avulla voin ajoittaa koodin formatoijana. Noin 10 minuutin harjoittelun jälkeen tajusin, että tästä pluginista tulisi aika typerä:
- Tunnista, onko tiedosto Java
- Suorita
google-java-format -i ${file}
- Raportoi mahdolliset virheet takaisin käyttäjälle
Nämä vaiheet ovat pohjimmiltaan ”suorita komento tallentamisen yhteydessä”, ja kävi ilmi, että joku on jo kirjoittanut laajennuksen! emeraldwalk/vscode-runonsave lukee Visual Studio Code -asetukset, sovittaa tiedostot säännölliseen lausekkeeseen ja suorittaa sitten käyttäjän antaman komennon. Tämä osoittautui minimaaliseksi mutta täydelliseksi ratkaisuksi!
Asensin RunOnSaven ja google-java-format
:
$ code --install-extension emeraldwalk.RunOnSave$ brew install google-java-format
Sitten määrittelin RunOnSaven suorittamaan google-java-format
tiedostoille, joiden pääte on .java
Visual Studio Code -asetuksissa:
{ "emeraldwalk.runonsave": { "commands": , },}
Tämä edellyttää, että google-java-format
on $PATH
:ssa. Jos se ei olisi, voisin sen sijaan määrittää koko polun binääriin:
{ "cmd": "/usr/local/bin/google-java-format --replace ${file}"}
Vietettyäni muutaman tunnin yrittäen saavuttaa yhdenvertaisuuden google-java-formaatin ja Visual Studio Code:n formatOnSave
:n välillä, minusta tuntuu, että olen saavuttanut täydellisen ratkaisun.