Jak wymusić formatowanie kodu w projekcie?

0

Witam!

Poszukuję narzędzia, które umożliwi mi formatowanie i sprawdzanie formatowania kodu C++ w projekcie.
Projekt oparty głównie o Visual Studio, obejmuje też środowisko Node.js, development z użyciem Windows OS.

Sporo się naszukałem i znalazłem jedynie:

  • clang-format - Całkiem niezły, ale baardzo ciężko mi odpalić go dla konkretnych typów plików (.cpp, .hpp, .h), zazwyczaj dostaję na twarz błąd mówiący, że coś jest folderem, albo rzuca błędami z plików w zupełnie innych formatach. Dodatkowo dokumentacja (moim zdaniem) nie jest zbyt pomocna...
  • .editorconfig - niby w porządku, ale nie sprawdza wszystkiego, w większości pozwala łatwo go obejść i przede wszystkim: nie widzę możliwości odpalenia jakiegokolwiek sprawdzenia z poziomu linii poleceń.

To, czego szukam powinno zapewniać:

  • możliwość sprawdzenia z poziomu linii poleceń - musi rzucić błędem, gdy kod nie będzie się pokrywał z ustawieniami
  • musi być łatwo konfigurowalny w CI - w zasadzie pokrywa się z poprzednim punktem, ale chodzi też o to, że nie chcę robić zbyt wielu udziwnień w konfiguracji runnera CI by odpalić sprawdzenie formatowania kodu...
  • musi być jak najbardziej samodzielny - zależy mi na tym, by nie instalować nie wiadomo ile narzędzi, plików i innych tego typu, by móc sprawdzić format
  • opcjonalnie: powinien umożliwiać sformatowanie i zedytowanie plików lokalnie, zanim zrobi się commita.

Póki co mam wrażenie, że w innych językach jest to dużo prostsze, a przede wszystkim w ogóle łatwo dostępne. Więc wątpię by w języku takim jak C++ nie było odpowiednich narzędzi.

Mam nadzieję, że będziecie mi w stanie polecić coś, co będę mógł wykorzystać, biorąc pod uwagę używane narzędzie i środowisko.

Dziękuję!

2

@Bartosz36: Mam wrażenie, że clang-format odpowiada na twoje zapotrzebowania, powinienneś się z nim pogodzić. Po prostu napisz skrypt, który odpali odpowienią komendę dla plików z odpowiednim rozszerzeniem.

0

@Cepo: Trochę też skłaniam się ku clang-format, jednak odpycha mnie od niego fakt, że ciężko mi opracować prawidłową komendę.
Na przykład na SO znalazłem wątek, w którym zaakceptowana odpowiedź:

clang-format -i -style=WebKit *.cpp *.h

zwracało mi:

Formatting *.cpp
invalid argument
Formatting *.h
invalid argument
Error: clang-format exited with exit code 1.

Dla innych poleceń ( */**, **/** i inne dziwne wymysły) otrzymywałem taki sam błąd lub is a directory.

4

To wygląda, po prostu, na niedorobioną powłokę, która nie obsługuje globbingu. Windowsowy cmd? Jak tak, no to cóż — musisz napisać tam napisać pętlę po plikach… ale wygodniej Ci będzie przesiąść na coś lepszego. Chociażby na PowerShella.

3
Bartosz36 napisał(a):
Formatting *.cpp
invalid argument

Czyli pod windowsami ...

for %i in (*.cpp,*.h) do clang-format -i -style=WebKit %i

Uwaga! w pliku .bat podwoić znaki %

0

@Cepo:

Nie możesz napisać skryptu w pythonie, który sprawdzi czy plik nie jest folderem i jakie ma rozszerzenie?

W tym rzecz, widzisz, już zaczyna się instalowanie Pythona, a to pisanie "prostych skryptów", a ja chciałbym zawołać to jedną linijką, na przykład dla ESLint całość wygląda tak:

npx eslint ./src --fix

I mam całe źródła naprawione albo przynajmniej sprawdzone.

@Althorion: Rzecz w tym, że już korzystam właśnie z PS (ale mój błąd, widzę, że zapomniałem o tym wspomnieć).

1
Bartosz36 napisał(a):

... a ja chciałbym zawołać to jedną linijką ...

Podąłem ci tą jedną linijkę, w czym problem?
Możesz ją zrobić jako skrót lub zapisać do pliku .bat

0

@_13th_Dragon: Gdyby było mi to pomocne, to bym oznaczył odpowiedź, ale dostawałem:

PS C:\Dev\Projects\myProj> for %i in (*.cpp,*.hpp) do npx clang-format -i %i
+ for %i in (*.cpp,*.hpp) do npx clang-format -i %i
+    ~
Missing opening '(' after keyword 'for'.
At line:1 char:17
+ for %i in (*.cpp,*.hpp) do npx clang-format -i %i
+                 ~
Missing argument in parameter list.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingOpenParenthesisAfterKeyword

PS C:\Dev\Projects\MyProj> for(%i in (*.cpp,*.hpp)) do npx clang-format -i %i
+ for(%i in (*.cpp,*.hpp)) do npx clang-format -i %i
+                 ~
Missing argument in parameter list.
At line:1 char:25
+ for(%i in (*.cpp,*.hpp)) do npx clang-format -i %i
+                         ~
Missing statement body in for loop.
At line:1 char:28
+ for(%i in (*.cpp,*.hpp)) do npx clang-format -i %i
+                            ~
Missing statement body in do loop.
    + FullyQualifiedErrorId : MissingArgument

i szczerze mówiąc nie chce mi się w to bawić, gdyż tak jak zaznaczałem wcześniej: zależy mi na możliwie jak najprostszym rozwiązaniu, tymczasem idzie to w stronę kolejnych skryptów i udziwnień.

Więc odpowiadając na Twoje pytanie: W tym problem.

2

Biorąc pod uwagę, że Ty nie masz problemów z używanym narzędziem formatującym, tylko z powłoką, to raczej wszystko jedno, co wybierzesz, te problemy nie znikną…

0

@Bartosz36: to nie PS to zwykły batch.
Dla PS:

foreach($file in Get-ChildItem -Path c:\temp\* -Include *.cpp,*.hpp) { npx clang-format -i $file.Name }

1 użytkowników online, w tym zalogowanych: 0, gości: 1