うちの会社にはgitmoji文化がありまして、コミットの先頭に絵文字をつける風習があります。
どんなことをするのかというと、例えばAndroidのコミットは以下のemojiがひも付きます
これをgit commit時にprefixにつけるだけです。
:robot: Build Error Fix
github上でこんな見た目となり、「これはAnroidのbuildエラーを直したのかー」とわかりやすくなりますね!
メリットとしては単純に楽しい点もありますが、
「ログの情報量が上がる」点があります。
例えばAndroid特有の同じバグを二回踏んでしまったとき、前回なにやったかなーとcommitログを漁る機会がありました。そんなときもgit log のgrepか、githubのsearchでgitmojiを検索すれば一発でたどり着きました!
$ git log --oneline --grep :robot
xxxxxxx :robot::lipstick:[AIRCLOSET-2010] Fix: TextInputでタブバーが押し上げられる現象fix
楽しい、ググラビリティを上げるという点でgitmojiは一押しです。
淡白なcommit一覧もgitmojiがあれば、ほら、華やかさを感じませんか・・・?
gitmojiのcode探すの面倒問題
gitmojiはwebページに公開されています。
https://gitmoji.carloscuesta.me/
emojiのcodeを毎回覚えているわけでもなく、commitのたびに都度サイトを見に行っていました。なんか面倒です。
レアな修正なんかが登場するとcodeは調べなきゃわかりません。
wipとか、CI
とか覚えてられない・・・
typo問題
そして慣れ始めたころ、typoはやってくるのです・・・。
だ、ダサい・・・!
問題を解決するCLI
そんな問題点を解決するのにちょうどよいCLIを見つけました。
gitmoji-cliです。
このgitmoji-cli、
- gitmoji一覧がわかる
- gitmojiの検索ができる
- gitmojiを使ったコミットができる
おお、これがあればtypoコミットもないし、terminalでいつでもgitmoji検索できる!!!
といった機能があって大変よろしいのですが、1箇所不満があって、「gitmojiを使ったコミット」がgpgを求めてくるため、gpg設定をしないとコミットできないという点です。
(設定で解除できるかもしれませんが、デフォでgpg求めてくるのはよくない)
なんだかそれはめんどくさかったので、いい方法はないかなーと思案した結果、いい機会だしgpg求めないバージョンのgitmoji-cliを作ってみることにしました。
できたもの
$ yarn global add gitmoji-c
gitmoji一覧がわかる
$ gitmoji list
gitmojiの検索ができる
$ gitmoji list -s <search word>
# or
$ gitmoji list --search=<search word>
# or
$ gitmoji list <search word>
gitmojiのコミットができる(応答型)
$ gitmoji commit
その他
...僕の場合、「commitでgitmojiを複数書きたいと」いったニーズもあるため、gitmoji-cに機能拡張を行っていくつもりです!
そしてこれはたまたまなんですが、
shell上で絵文字が表示されるというメリットが付いてきました。やったね!
今回使用したライブラリ
oclif
CLI 作る
とかでググるとgoでつくる記事が多いのですが、goは触ったことがないので、nodeで作ってみました。
今回は oclifを使って作成します。
結構これがなんでもよしなにやってくれるやつで、initialで作成する際にtypescriptを選べたり、ci選択でcircleciを選択すると自動で .circleci/config.yml
を吐き出してくれたりとしてくれるので、サクッとCLIを作りたいユーザーには良いものです!
注意
version 1.13.2まではnpm publish
したときにtsのbuildがうまくできず、コマンドが正常に実行できないバグがありました。
こちらは1.13.3にて修正されたので現在は正常に動作するはずです!
publishしたのに動かなくて悲しかったのですがissueに上げたら数日で解決策を提示してくれました。コミュニケーションの早いライブラリは良いですね!
inquirer
gitmoji-cliのコミットでは応答型CLIとなっていて、
- 絵文字の選択
- コミットタイトル
- コミットメッセージ
の入力を求められます。
この応答型CLIを実装するのがinquirerです。
もともとはenquirerを使うつもりだったのですが、絵文字の選択時に外部データを使った選択肢を実装する方法がパッと見ではわかりませんでした。
本家でもinquirerは使用されているのでそのまま採用しました。source
要素として外部データを渡すと選択可能になります。
class Prompt {
public get questions() {
return [
{
name: 'gitmoji',
message: 'Choose a gitmoji:',
type: 'autocomplete',
async source(_: any, input: { toLowerCase(): void; }) {
const emojiList = await gitmojis()
const searchResult = emojiList.filter((gitmoji: IGitmoji) => {
const emoji = gitmoji.name.concat(gitmoji.description).toLowerCase()
// @ts-ignore
return (!input || emoji.indexOf(input.toLowerCase()) !== -1)
})
return displayValue(searchResult)
}
},
{
name: 'title',
message: 'Enter the commit title',
},
{
name: 'message',
message: 'Enter the commit message:',
},
]
}
}
execa
「git commit
実行させたらええやん」と思っていたんですが、
「それどうやって実行させんの・・・?」と思っていたところに
execaの登場
import * as execa from 'execa'
const {stdout} = await execa('git', [
'commit',
'-m',
title,
'-m',
message,
])
第一引数にはコマンド名で、第二引数には配列でオプションを渡すことができます。
簡単でしたね!
さぁ、あなたもgitmoji、よかったらやってみませんか・・・?