自作言語のシンタックスハイライトをGitLabに対応させる
はじめに
自作のプログラミング言語を作っているとき、各種エディタのシンタックスハイライトであれば、それぞれに対応したシンタックスハイライトの定義ファイルを書いて配布すれば対応可能です。一方、GitHubやGitLabといったSaaSの場合、なんとかしてサービス提供側に取り込んでもらう必要があるためかなりハードルが上がります。
今回GitLabに自作言語 Veryl のシンタックスハイライト対応を入れてもらうことに成功したので、そこまでの流れを書いておきます。
なぜGitLabなのか
おそらくgitのホスティングサービスとしてはGitHubがシェアトップだと思われるため、できればGitHubに対応してもらいたいところです。GitHubが利用しているシンタックスハイライトのライブラリは linguist というもので、これは対応言語の追加PRを受け付けています。しかし、このPRの受付基準は厳しく、GitHub上に2000ファイル以上当該言語のファイルが必要です。ときどき大手企業の社員と思われる人から「この言語はGitHub上にはまだ少ないけど社内でたくさん使っているし業界でも採用されて将来有望だから」などとゴリ押しするケースが見られますが、基準を満たさないものは全て却下されています。今回対応させたい言語 Veryl はこの記事執筆時点では500ファイル前後なのでまだ基準を満たせていません。
一方GitLabは少なくとも現時点ではそういった基準はなく、言語の追加を受け付けていそうだったため、今回はGitLabへの追加にチャレンジしてみることにしました。
(GitHubについては基準を満たしたあとで追加する予定なので、うまくいったらその時にまた記事を書きます)
GitLabへのコントリビュート
GitLabにコントリビュートする際の手順は以下にまとまっています。
流れとしては以下のようになります。
- GitLab Community Forkへのアクセスリクエストを申請する
- GitLabのコードにシンタックスハイライトを入れる
- 動作を確認する
- 変更をマージリクエストにする
- レビューに対応する
GitLab Community Forkへのアクセスリクエストを申請する
GitLab Community Fork (https://gitlab.com/gitlab-community/gitlab-org/gitlab) はGitLabの開発本体である https://gitlab.com/gitlab-org/gitlab をフォークしたリポジトリになります。OSSにコントリビュートする際には、自身のアカウントにフォークして、そこで作業をするのが一般的だと思いますが、GitLabのような大規模なプロジェクトの場合、フォーク・環境構築・upstreamへの追従にかかるコストが高く大変です。そこで、GitLab Community Forkに各コントリビューターが直接ブランチをpushできるようになっています。
上記のドキュメントから "Request access to the community forks." のリンクへ飛ぶとアクセスリクエストが生成されます。私の場合、1日以内に返信があり、「簡単な自己紹介とどういった分野に貢献したいか教えてください」とのことだったので「自作言語のシンタックスハイライトを追加したい」と返信して翌日には承認されました。
GitLabのコードにシンタックスハイライトを入れる
GitLabにシンタックスハイライトを追加する方法は以下にまとまっています。
GitLabのシンタックスハイライトはフロントエンド側は highlight.js を使っているため、それに対応したnpmパッケージがあれば比較的簡単に追加することができます。
Verylの場合すでにhighlight.jsの定義ファイルは用意してあったので、この機会にnpmに公開しました。
また、バックエンド側では Rouge が使われており、こちらはこのリポジトリに直接PRを出すことになります。ただ、こちらのプロジェクトはそれほどアクティブではなく、多くの言語追加PRが残されている状況なので追加までにはかなり時間がかかりそうです。バックエンド側は主にマージリクエスト画面の差分表示におけるシンタックスハイライトなので、この対応がなくともそれほど大きな問題はありません。GitLabのメンテナもフロントエンド側のみの追加で受け入れてくれるようです。
動作を確認する
追加したシンタックスハイライトが正しく動作しているかどうかを実際のUI上で確認したいのですが、GitLabほどの規模になると手元で動かすのも簡単ではありません。
そこで Gitpod というサービスを使うことが推奨されています。
これはブラウザ上で動くIDEで、上記のドキュメントに従うとセットアップされたGitLabの環境が立ち上がります。また、バックグラウンドでその環境のコードを反映したGitLabのインスタンスも立ち上がっており、コードを変更すると自動で反映されます。(ただし、今回はnpmのパッケージ追加をしたため、yarn install highlightjs-veryl といったコマンドは手動で実行する必要がありました)
また、この後のマージリクエスト作成のところで変更前後のスクリーンショットを張る場所があるので、シンタックスハイライト追加前と追加後のスクリーンショットを取っておくといいでしょう。
この Gitpod は無償枠が10時間/月あるのですが、IDEの起動やGitLabの起動にかなり時間がかかるため思いのほか消費が早く、今回のシンタックスハイライト追加で5時間ほど消費しました。
Linkedinのアカウントを連携すると50時間に増やせるようなので、抵抗のない方は連携してもいいかもしれません。私の場合はLinkedinはほぼVerylの宣伝用アカウントとして運用しているので連携して増やすことにしました。
変更をマージリクエストにする
動作が確認できたら変更をコミット、プッシュしてマージリクエストを作成します。
コミット時のメッセージにはChangelogを自動生成するためのメッセージが必要です。
今回は以下のようにしました。
Add highlighting for Veryl language
Changelog: added
マージリクエストの作成手順は以下になります。
作成し、CIが通ったところで @gitlab-bot ready とコメントしてレビューを依頼するといいと思います。
作成したマージリクエストはこちらです。
レビューに対応する
マージリクエストを作るとボットがタグ付けやレビュアーの割り当てなどをしてくれます。コメントに対応しつつマージを待ちましょう。今回の場合、1週間程かかりました。
マージが決まったタイミングで、どのリリースに含めるかも決まってマイルストーンとしてタグ付けされます。今のところ、8/14リリース予定のGitLab 18.3に入るようです。
Discussion