Node.js環境でClangを使ったC、C++、Java、JavaScriptフォーマッタを開発しました。
(github.com/lumirlumir)- GitHubリポジトリ: https://github.com/lumirlumir/npm-clang-format-node
- 公式ドキュメントサイト: https://clang-format-node.lumir.page/
こんにちは!
Node.js環境でClangを活用したC、C++、Java、JavaScriptフォーマッタを開発しました。このプロジェクトは、すでにメンテナンスされていないAngularのclang-formatパッケージをベースに新たに始めたプロジェクトです。
2〜3か月前にも似た内容を共有しましたが、今回v1.3.0バージョンをリリースし、ユーザーの皆さんがより簡単かつ便利に使えるよう詳細なドキュメントサイトを追加しました。ドキュメントサイトはこちらで確認でき、基本的なインストール方法からこのパッケージを使うべき理由までさまざまな内容を掲載しているので、興味のある方は参考にしていただければと思います。
今回のアップデートでは複数のテストを追加してパッケージの安定性をさらに高め、新機能も追加されました。
このパッケージはすべてMITライセンスで、自由に利用できます。
clang-format-nodeとはどのようなプロジェクトですか?
このパッケージは、LLVMのCコンパイラとして有名なClangのclang-formatをベースに、C、C++、Java言語のコードフォーマットをサポートするNode.jsパッケージです。簡単に言えば、Node.js環境でPrettierに似た役割を果たしますが、PrettierがサポートしていないC、C++、Java言語のフォーマットを提供する点が差別化ポイントです。
特に、Node.jsコアやElectron開発のようにJavaScriptコードとC/C++コードを一緒に書く必要がある場合、clang-format-nodeが役立ちます。
既存のclang-formatパッケージには、UbuntuなどのOS環境に依存する追加依存関係をインストールしなければならない煩雑さがありましたが、このパッケージを使えば別途インストールせずすぐに利用できます。また、既存パッケージはCI環境でNode.jsおよびnpmベースのワークフローに統合しにくい面がありましたが、clang-format-nodeはnpmでインストールしてスクリプトを設定するだけで手軽に使えるため、CI環境で多くの利点があります。
では、clang-format-nodeパッケージの特徴は何ですか?
1. Angularのclang-formatを置き換えるDrop-in Replacement
clang-format-nodeはAngular/clang-formatパッケージを簡単に置き換えられるDrop-in Replacementです。
既存パッケージからclang-format-nodeへの移行は非常に簡単で、特別に複雑な手順なしですぐに使い始められます。
2. Clangを使うための追加依存関係は不要で、Node.jsだけで十分です。
PythonやC++のような追加依存関係は一切必要ありません。Node.jsさえあれば簡単に実行できます。
3. 幅広いサポート範囲
さまざまなOSやアーキテクチャ、Node.jsバージョン、GitHub Actionsランナーイメージ、Dockerビルドイメージなどを幅広くサポートします。
4. 簡単なCI設定
複雑な設定なしで、他のNode.jsパッケージと同じようにclang-format-nodeを利用できます。
5. 自動化されたビルドとリリース
clang-formatの更新があるたびに、新しいnpmバージョンが自動でリリースされます。GitHub Actionsが定期的に更新を検知し、パッケージをビルドした後にPull Requestを作成してくれます。
clang-formatとgit-clang-formatでコードをフォーマットする
(以下の文章は、私がhttps://clang-format-node.lumir.page/docs/get-started/introductionセクションに英語で書いた内容を一部日本語に翻訳したものです。)
コードフォーマットの重要性
コードは常にフォーマットしましょう
コードフォーマットは、コード品質を高めるうえで非常に重要な作業です。フォーマットの本質は、コードのフォーマットを一貫して保ち、可読性と理解しやすさを高めることにあります。
clang-formatとは?
clang-formatは、CやC++のような言語のソースファイルを自動でフォーマットしてくれるツールで、LLVM Clangオープンソースプロジェクトの一部として開発されました。
動作の仕組み
- 設定ファイルを作成
フォーマットスタイルを定義した設定ファイル(.clang-format)を作成します。 - コマンドを実行
clang-formatコマンドを実行すると、そのスタイルルールに従ってソースコードが自動的に再構成されます。
主な特徴
- 多様な言語をサポート
C、C++、Java、JavaScript、Objective-C、Protobuf、C#など、さまざまな言語をサポートします。 - フォーマットコマンドの例
このコマンドを実行すると、clang-format -i my_source.cppmy_source.cppファイルが指定したスタイルどおりに自動でフォーマットされます。
コードフォーマットの例
// Before formatting
void test(QString&data, bool extraString) {
int i=0;
for (i=0;i<3;i++) {
data+="reallylongstringtoproducealonglineasanexample" + QString::number(i * 1000) + "/filetoload.html";
if (extraString)
{
data += "some-extra";
}
}
}
// After formatting
void test(QString &data, bool extraString)
{
int i = 0;
for (i = 0; i < 3; i++) {
data += "reallylongstringtoproducealonglineasanexample" + QString::number(i * 1000)
+ "/filetoload.html";
if (extraString) {
data += "some-extra";
}
}
}
上の例は、clang-formatがどのようにコードをフォーマットするかを示しています。フォーマットルールはチームのスタイルに合わせて自由に設定できます。
clang-formatの問題点
clang-formatは優れたツールですが、既存コードやコミット履歴に関する問題を引き起こすことがあります。
主な問題点
- 既存コードとの衝突
ファイル全体をフォーマットすると、フォーマットと関係ない部分まで変更されてしまい、不要な差分が発生します。 - コミット履歴の混乱
大規模なフォーマット変更はコミット履歴を複雑にし、ブランチのマージ、コードレビュー、コード分析を難しくする可能性があります。 - 新しいコードと既存コードの不一致
すでにフォーマット済みのコードに新しいコードを追加する際、フォーマットの一貫性を維持しにくい場合があります。
解決策: git-clang-format
git-clang-formatは、変更されたコードにだけフォーマットを適用できるようにしてくれるGit拡張ツールです。これを使うことで次のような利点があります。
- フォーマット範囲の最小化: 変更されたコードにのみフォーマットを適用
- レビューの簡素化: フォーマット変更と開発変更を分けて確認可能
git-clang-formatの使い方
インストール
git-clang-formatはclang-format-nodeパッケージと一緒に提供されます。clang-format-git npmパッケージをインストールして利用できます。
基本ワークフロー
- コードを書きます。
- 変更内容をstagingに追加します(
git add)。 git-clang-formatを実行します。
例
# 新しいファイルを追加して変更内容をステージング
$ git diff --staged
diff --git a/x.cpp b/x.cpp
new file mode 100644
index 0000000..af14ed5
--- /dev/null
+++ b/x.cpp
@@ -0,0 +1,3 @@
+int main() {
+
+}
# git-clang-format を実行
$ git-clang-format
changed files:
x.cpp
# フォーマット後の状態を確認
$ git status
On branch master
Changes to be committed:
new file: x.cpp
Changes not staged for commit:
modified: x.cpp
このワークフローにより、フォーマット変更と開発変更を独立してレビューできます。フォーマット変更が気に入らなければ、git checkoutで元に戻すこともできます。
スタイル指定
--styleオプションを使ってフォーマットスタイルを設定できます。
$ git-clang-format --style=WebKit
$ git-clang-format --style=file # `.clang-format`ファイルを使用
結論
clang-formatは強力なツールですが、実務では単にclang-format -iコマンドだけでは不十分なことが少なくありません。変更された部分にだけフォーマットを適用するgit-clang-formatを使えば、効率的にコードを管理し、レビュー工程を簡素化できます。
git-clang-formatは変更箇所だけをフォーマットするため、クリーンでプロフェッショナルなコードベースを維持しながら、柔軟な開発環境を提供できます。作業コミットやブランチ全体をフォーマットするときも、いくつかのGitコマンドを追加で使うだけで、フォーマットの問題を簡単に解決できます。
長文を読んでいただきありがとうございました! GeekNewsの読者の皆さん、どうぞ良いお年をお迎えください🙇♂️
- GitHubリポジトリ: https://github.com/lumirlumir/npm-clang-format-node
- 公式ドキュメントサイト: https://clang-format-node.lumir.page/
2件のコメント
いいねを押していきます
ありがとうございます!!