最強（）のテンプレートリポジトリを作った

## 概要

言語やフレームワークに依存せず、ほぼあらゆるプロジェクトに共通するリポジトリの設定ファイルなどがあります。それらをまとめたテンプレートリポジトリとして、ベーステンプレートリポジトリ（Base Template Repository）を作りました。

## GitHub リポジトリ

### 英語版（本家）

https://github.com/haru52/base_template

### 日本語版

https://github.com/haru52/base_template_ja

## 背景

ソフトウェア開発をする中で生産性の低さという課題に直面することがあると思います。開発生産性を低下させる要因の一部として次の 3 点が挙げられます。

1. 無駄な作業の多さ
   - 句読点の付け方やインデントにおけるスペースの個数など本質的でないコードレビューで疲弊
   - リリースや依存ライブラリ更新など毎回同じような単純作業の繰り返しが面倒。特に複数リポジトリを運用する場合に顕著
2. コミュニティへの不親切さ
   - コントリビュートしようと思っても、開発規約などコントリビューションに必要なドキュメントなどが不足している
   - OSS として公開しないリポジトリでも、開発規約などが不明確だと将来の自分が困る
3. ボイラープレート設置の繰り返し
   - 複数リポジトリで毎回同じ設定ファイル（`.editorconfig` などのボイラープレート）などを設置する作業が辛い

そこで、これらの課題を解決するため、ベーステンプレートリポジトリ（Base Template Repository）の英語版と日本語版を作りました。これは、あらゆるプロジェクトのベースとなるテンプレートリポジトリです。

## 詳細

ベーステンプレートでは先述の課題 3 点を次のように解決します。

1. 開発フロー自動化
2. コミュニティスタンダード準拠
3. GitHub テンプレートリポジトリ機能

### 1. 開発フロー自動化

コードレビューやリリースなどの開発フローを自動化することで、人間が無駄な作業に従事するコストを削減します。具体的には以下の通りです。

- あらゆるプロジェクトで共通して必要になるであろう linter などの設定ファイルの設置
- Git コミット時と CI 実行時の lint 自動実行
- [Conventional Commits](https://www.conventionalcommits.org/ja/v1.0.0/) の規約に従ったコミットメッセージの強制
- GitHub Actions による CI/CD 環境
- 自動コードレビュー
- コミットメッセージに基づく自動リリース
- 依存ライブラリなどの自動更新

### 2. コミュニティスタンダード準拠

コミュニティスタンダード [^1] に完全準拠し、コントリビューティングガイドライン（`CONTRIBUTING.md`）や issue テンプレートなどが設置してあります。これにより、コントリビュートしやすくコミュニティに親切なプロジェクトを実現します。

[![community_standards.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177113/353155a4-e48c-e6d8-07c2-1982561c3ad2.png)](https://github.com/haru52/base_template_ja/community)

### 3. GitHub テンプレートリポジトリ機能

ベーステンプレートは [GitHub のテンプレートリポジトリ機能](https://docs.github.com/ja/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template)を利用しています。リポジトリ初期化時に空の状態ではなくベーステンプレートの構成を継承することで、ボイラープレート設置コストを大幅に削減します。

### その他

ベーステンプレートリポジトリには英語版と日本語版の 2 種類あるので、プロジェクトに応じてお好きな方をご利用ください。例えば OSS として全世界に公開するプロジェクトでは英語版を選択するなどが考えられます。

ご利用の際は GitHub のテンプレートリポジトリ機能を介してご利用いただくのが基本ですが、設定ファイルの一部をコピペするなど部分的な利用でも十分に役立つかと思います。また、ベーステンプレートで採用しているツール群に対して追加・変更・削除を加えるなど、プロジェクトに応じてカスタマイズしていただければと思います。

なお、ライセンスは利用時のクレジット表記すら不要な非常に緩いものを選択しています。なので、商用利用を含めほぼ完全に自由な形でご利用いただけます。

### 技術スタック

|            カテゴリー             |                                        ツール                                         |
| --------------------------------- | ------------------------------------------------------------------------------------- |
| IDE／エディタ設定                 | [EditorConfig](https://editorconfig.org/)                                             |
| .gitignore 管理                   | [gibo](https://github.com/simonwhitaker/gibo#readme)                                  |
| Git フック                        | [Husky](https://typicode.github.io/husky)                                             |
| Git コミット I/F                  | [Commitizen](https://commitizen.github.io/cz-cli/)                                    |
| CI/CD                             | [GitHub Actions](https://github.com/features/actions)                                 |
| コードレビュー                    | [reviewdog](https://github.com/reviewdog/reviewdog#readme)                            |
| リリース                          | [semantic-release](https://semantic-release.gitbook.io/semantic-release/)             |
| 依存性更新                        | [Dependabot](https://docs.github.com/ja/code-security/dependabot)                     |
| Lint：Git ステージ                | [lint-staged](https://github.com/okonet/lint-staged#readme)                           |
| Lint：Git コミットメッセージ      | [commitlint](https://commitlint.js.org/)                                              |
| Lint：クレデンシャル              | [Secretlint](https://github.com/secretlint/secretlint#readme)                         |
| Lint：Markdown                    | [markdownlint-cli](https://github.com/igorshubovych/markdownlint-cli#readme)          |
| Lint：英語テキスト（散文）        | [Vale](https://vale.sh/)                                                              |
| Lint：日本語テキスト（散文）      | [textlint](https://textlint.github.io/)                                               |
| Lint：YAML                        | [yamllint](https://yamllint.readthedocs.io/)                                          |
| Lint：JSON、その他                | [Prettier](https://prettier.io/)                                                      |
| Lint：GitHub Actions ワークフロー | [actionlint](https://github.com/rhysd/actionlint#readme)                              |
| Lint：GitHub PR タイトル          | [semantic-pull-request](https://github.com/marketplace/actions/semantic-pull-request) |

## 最後に

このベーステンプレートリポジトリが皆さんの開発生産性を向上する一助になれば幸いです 😌

## 参考

- [Super-Linter · Actions · GitHub Marketplace](https://github.com/marketplace/actions/super-linter)
- [Documentation testing | GitLab](https://docs.gitlab.com/ee/development/documentation/testing.html)

[^1]: [オープンソースガイドライン | Open Source Guides](https://opensource.guide/ja/) など。