見出し画像

新規プロジェクトを一瞬で立ち上げるコマンド boilerplate を作りました

Showcase Gig アーキテクトチームの赤嶺(@kazz187)です。皆さん、 2022年もたくさん Go を書きましたか?

私は GitHub Copilot なしでコードが書けない老体になってしまいました。このまま AI に頼って年を重ねていけたら最高です。

今回は、新しいプロジェクトを立ち上げるときに、一瞬でプロジェクトを始められるコマンドを作りました。社内ツールとして作ったのですが、汎用性があるので個人でも使いたく、クリスマスプレゼントとして公開することにしました!

そもそも何に困っていたのか

みなさんは Go で新しいプロジェクトを立ち上げるにあたって困った経験はないですか?

新規プロジェクトを始めるたびに、以下のようなことで悩んでないですか?

  • ログ、トレース、メトリクスなどを設定するのが大変

  • Dockerfile や Docker Compose、 CI/CD などの設定が大変

  • DI ツールの設定が大変

  • うまく行っているプロジェクトからコピー&ペーストしてみたけど、サービス名の置換が大変

  • Database のコネクションやトランザクションなど、インフラ層のユーティリティを毎度開発するのが大変

  • クリーンアーキテクチャやってみたけど、ディレクトリ構成を毎回作るのが大変

  • モジュラモノリスにしてみたけど、新しいモジュールを作るたびに準備が大変

これらがすでに準備された状態からプロジェクトを始められると、最初期に Embedded SRE 的な人がチームにいなくてもすぐにプロジェクトを始めて開発環境へデプロイできる準備が整います。

どう解決したか

例えば rails new のようにすぐプロジェクトが始められると理想ですよね。

社内の横展開したい非機能がすでに実装されたプロジェクトリポジトリをメンテし、それをテンプレートにできると初期開発が楽になるのではないかという発想から、今回 boilerplate コマンドを開発しました。

テンプレートにできるツールがいろいろあるのは知っていましたが、テンプレート記法を用いて作ると、学習が必要だったり、そのプロジェクト自体がビルドできなかったりし、日々のメンテが大変だと考え、独自のシンプルなツールを作ってみることにしました。

置換

このコマンドは特定の文字列を置換することに特化しています。

例えば BoilerPlate などの2単語で構成されているほかの予約語などとかぶらないような文字列を置換することで、テンプレートから新規プロジェクトを生成できます。

なぜ2単語にしたかというと、 Camel, Snake, Kebab などの区別がつくようにするためです。

例えば新しく MyNewService というプロジェクトを立ち上げるとします。

  • BoilerPlate -> MyNewService

  • boilerPlate -> myNewService

  • boilerplate -> mynewservice

  • boiler-plate -> mynew-service

  • boiler_plate -> mynew_service

このようにプロジェクト内にいろんな形式で存在する単語を一括で置換してくれます。

これはファイル内の文字列だけではなく、ファイル名、ディレクトリ名も置換してくれるため、 ./docker/boiler_plate/Dockerfile みたいなファイルが存在した場合、 ./docker/my_new_service/Dockerfile みたいなディレクトリとファイルを作ってくれます。

加えて、特殊な文字列を単純に置換する機能もあります。

  • bp-sample -> mynew-server

のような置換ルールも定義できます。

設定ファイル

テンプレートリポジトリには直下に boilerplate.yaml というファイルを置くことで、置換ルールを定義できます。

project: BoilerPlate
targets:
  - name: repository name
    string: bp-sample
ignore_prefixes:
  - ".git/"
  - "boilerplate.yaml"
  • project は2単語の文字列を指定します。先程の例で言う BoilerPlate です。

  • targets は追加で置換する対象を指定します。先程の例で言う bp-sample です。今回はテンプレートリポジトリ名が bp-sample であるとします。

  • ignore_prefixes は置換対象から除外するファイルやディレクトリを指定します。今回は .git/ と boilerplate.yaml を複製の対象から除外します。

これで、 BoilerPlate の Camel, Snake, Kebab などのケースの文字列や bp-sample という文字列を使ってプロジェクトを作るとテンプレートリポジトリを作ることができます。

インストール

go install github.com/showcase-gig-platform/boilerplate@latest

使い方

cd /YOUR_WORKING_DIR/
git clone https://github.com/your-org/bp-sample
boilerplate gen --src ./bp-sample --dst ./mynew-server

このコマンドを実行すると、新規プロジェクト名や、追加の置換対象の文字列を対話式で聞かれるので入力していきます。

New project name (example: BoilerPlate): MyNewService
New repository name (example: bp-sample): mynew-server

対話が完了すると、 --dst で指定したディレクトリに新規プロジェクトが作成されます!

まとめ

社内の開発基盤を整えたら、次はそれを毎回再開発するのではなく横断的に広く使えるようにするにはどうしたらよいかという課題が生まれます。

今回は sed を駆使した bash ではなく、 Go でシンプルなユーティリティを作って課題を解決してみました。

社内ツールとして使ってましたが、個人の開発プロジェクトでも使いたいと思ったので、今回公開してみることにしました。

使い心地などフィードバックいただけるととてもうれしいです!

2023年も Go で楽しい開発やっていきましょう!

この記事が気に入ったらサポートをしてみませんか?