customizable-gitmoji-cliで、gitのコミットメッセージに絵文字を付ける

## はじめに

[gitmoji](https://gitmoji.carloscuesta.me/)文化というものがあります。

以下は私のプロジェクトにおけるコミット履歴です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107334/0e378818-006e-ec50-182d-dc158f122cf9.png)

参照：https://github.com/SnO2WMaN/customizable-gitmoji-cli/commits/master

## なぜ？

いろいろあると思いますが、私は以下の理由です。

### コミットの粒度を上げる

> 特技はgit commit -a -m いろいろ修正です！
> 参照：[横着で神経質な私とあなたに贈るgit add -p](https://qiita.com/crifff/items/1abf08bca4ce51db4775)

私は放っておくとこれになっちゃうので、なんとなくカテゴライズしておくことで目標立てて開発をするようにしました。 [^pe]

### Conventional Commitsの環境整えるの面倒になってきた

[Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0-beta.2/)というものがあります。（こっちのほうがスタンダードだとは思います、少なくともJavascript / Node.js / フロントエンドサイドのプロジェクトではそうだと思います）

大体次のようなコミットメッセージです。

```
fix: Fix Something
chore(deps): Update dependencies.
```

これは自動でバージョン更新したりするときなどに有用なんですが、いかんせんCLIの整備やいろいろ付け加えた結果設定ファイルがモリモリ増えちゃって何が何なのかわからなくなっちゃいました。

gitmojiでは、同作者によるCLI([gitmoji-cli](https://github.com/carloscuesta/gitmoji-cli))が用意されていて、導入も簡単だったので良かったです。

### 参考
- [GitHubのコミットメッセージに絵文字を入れて開発効率をあげる](https://qiita.com/Jung0/items/0a9a7a97a2c17f92d3c5)
- [Emojiで楽しく綺麗なコミットを手に入れる](https://goodpatch.com/blog/beautiful-commits-with-emojis/)
- [atom/blob/master/CONTRIBUTING.md#git-commit-messages](https://github.com/atom/atom/blob/master/CONTRIBUTING.md#git-commit-messages)

## 一方

gitmoji-cliはたしかに便利だったんですが、[本家のgitmoji](https://github.com/carloscuesta/gitmoji/blob/master/src/data/gitmojis.json)のみしか使えなかったので、プロジェクト下において明らかに不必要な絵文字があったり、逆に痒い所の為の絵文字が無かったりしてそこはそこで不便でした。

そこで今回、カスタマイズ可能な[customizable-gitmoji-cli](https://github.com/SnO2WMaN/customizable-gitmoji-cli)を作成しました。

## customizable-gitmoji-cli


**オプションの詳細などは[README-jp.md](https://github.com/SnO2WMaN/customizable-gitmoji-cli/blob/master/README-jp.md)を読んでもらえると助かります。**

このCLIでは、`.gitmojirc`などの設定ファイル[^cosmiconfig]によって自由に絵文字を追加することが出来ます。また、ESLint/Prettier/Stylelint/etc...の共有設定ファイルのようにプレセットを読み込む機能もあります。

[^cosmiconfig]: 設定ファイルは[cosmiconfig](https://github.com/davidtheclark/cosmiconfig)に対応しています。つまり`.gitmojirc`, `.gitmojirc.json`などの形式が対応しています。

```json:.gitmojirc
{
  "emojiFormat": "emoji",
  "presets": ["@sno2wman/gitmoji-preset"],
  "rules": [
    {
      "emoji": "🤡",
      "description": "Everything must go!!",
      "name": "clown_face"
    }
  ],
}
```

この設定ファイルをプロジェクトに含んでおけば、CLIからコミットをする限り、全員が同じコミット規則に従ってコミットが行われるはずです。

### emojiFormat

コミット時に添付される絵文字のフォーマットを選択できます。
`emoji`, `code`のどちらかを設定することが出来ます。

- emoji
    - 👌, 🐶, 🔪
    - `🔪 Kill process`
- code
    - `:ok_hand:`, `:dog:`, `:knife:`
    - `:knife: Kill process` (Github上などでは絵文字が表示されます)

私は`emoji`に設定しています。（たまに各種サービスやCI上では`:knife:`と表示されて見栄えが悪いので…）

### rules

以下の形式でgitmojiを定義してください。

```
{
  "emoji": "🦍",
  "description": "Feel good.",
  "name": "gorilla"
}
```

[ikatyang/emoji-cheat-sheet](https://github.com/ikatyang/emoji-cheat-sheet)が役に立つはずです。

### presets

まだ本家のgitmojiに対応するプレセットの[gitmoji-preset-base](https://www.npmjs.com/search?q=gitmoji%20preset)と、私個人の[@sno2wman/gitmoji-preset](https://www.npmjs.com/package/@sno2wman/gitmoji-preset)しかありません…
名前解決の方法は以下のとおりです。

- `@username/gitmoji-preset`
    - そのまま読み込みます
- `gitmoji-preset-foo` 
    - そのまま読み込みます
- `bar` 
    - `gitmoji-preset-bar`の形にして読み込みます。

`gitmoji-preset-base`を除く全てのプレセットは、プロジェクト直下に`npm i`/`yarn add`してインストールされている必要があります。

## 展望

- [#3](https://github.com/SnO2WMaN/customizable-gitmoji-cli/issues/3)
    - プレセット側で設定することで、コミット履歴より自動でバージョン更新の判断などが出来るようにしたい。

## おわりに [^emoji]

[^emoji]: 記事内で絵文字を使わない所が良くないと思う。

gitmojiが様々な場面で使われることを祈っています。

よかったらプロジェクトにスターをしてください。励みになります。

[貢献をしてくれるともっと喜びます。](https://github.com/SnO2WMaN/customizable-gitmoji-cli#contributors-)

[^pe]: 個人の感想です。