git commit時にリントツールでソースコードをチェックし、問題があればコミットを拒否するようにする設定はよくある。コミットが拒否されたら、開発者はソースコードを手直ししてもう一度コミットするわけだが、この手順は結構機械的だったりする。
tslintは--fix
オプションを渡せば、自動修正してくるものもある。なので、考え方を一歩進めて、問題を報告するのではなく、問題があるなら勝手に直してそのままコミットに含めてしまったほうが、だいたいのケースで無駄な手順が省ける。そうなっていれば、開発者も「コミットする前にリントしなくちゃ」といったことを意識しなくても良くなる。
本稿では、この考えのもと、コミット時にコードを自動修正する方法を紹介する。
必要なパッケージを入れる:
yarn add --dev husky lint-staged tslint prettier tslint-config-prettier tslint-plugin-prettier
- husky: git commit したときにlint-stagedを走らせるために必要
- lint-staged: git addされたファイルに対してtslintなどをかけるようにするために使う
- tslint, prettier: TypeScriptコードのスタイルを整形する
- tslint-config-prettier: tslintのルールのうちprettierとぶつかるものを無効化してくれる
- tslint-plugin-prettier: prettierをtslintの中で使う
必要なパッケージが入ったら、まずpackage.json
を変更する。
package.jsonのscripts
(NPMスクリプト)にprecommit
を追加し、lint-staged
を呼び出すようにする。こうすることで、git commit
したタイミングでリントが自動的に走るようになる。
{
"scripts": {
"precommit": "lint-staged"
}
}
同じく、package.jsonにlint-staged
のフィールドを追加する。
{
"lint-staged": {
"*.{ts,tsx}": [
"tsc --noEmit",
"tslint -p tsconfig.json -c tslint.json --fix",
"git add"
]
}
}
この設定例は3つのステップに分かれる:
-
tsc
でコンパイルできるかチェック -
tslint
でチェックしながら、直せるコードは自動修正 - 最後に(チェックがここまで問題なければ)、ステップ2で修正されたコードを
git add
その後、git commit
に続く流れになる。つまり、開発者はとくに意識することなく、コミットしたコードが自動修正された状態になる。
続いて、prettierの設定。
{
"singleQuote": true,
"semi": false,
"trailingComma": "all"
}
最後に、tslintの設定。extends
で["tslint-plugin-prettier", "tslint-config-prettier"]
を追加しておく。また、rules
に"prettier": true
も加える。
{
"defaultSeverity": "error",
"extends": ["tslint:recommended", "tslint-plugin-prettier", "tslint-config-prettier"],
"jsRules": {"no-unused-expression": true},
"rules": {
"arrow-parens": [true, "ban-single-arg-parens"],
"interface-name": [false],
"linebreak-style": [true, "LF"],
"max-line-length": [true, {"ignore-pattern": "<\\w+>"}],
"member-access": [true, "no-public"],
"no-any": true,
"no-irregular-whitespace": true,
"number-literal-format": true,
"object-literal-sort-keys": [true, "match-declaration-order-only"],
"prettier": true, // ここ
"quotemark": [true, "single", "jsx-double"]
},
"rulesDirectory": []
}
以上で、git commitしたときに、tslint+prettierで自動的にコードを修正できるようになる。