VSCode + Remote-Container + pre-commitで快適開発環境を構築する

SPONSORED LINK

様々な開発言語に適用できると思うので自分用にメモ。
読みづらいのは勘弁してください。
この記事では業務で開発しているGoのプロジェクト用に開発環境を構築していきます。

VSCodeの拡張機能Remote-Containerをインストール

Remote-Containerで設定ファイルを作成する。
一覧の中からGo用のDockerfileを作成するオプションを選択する。

以下の箇所を編集して、開発コンテナ内でpre-cimmitを使えるようにします。
golangci-lintのインストールはすでにDockerfileに明記されていたので特に書き加えません。

### カスタマイズ
# pre-commit
RUN curl -kL https://bootstrap.pypa.io/get-pip.py | python \
    && pip install pre-commit

.pre-commit.yamlを作成します。
git commit した際の設定を書いています。

ざっくりで言うと、

  • jsonファイルのフォーマットの整形や有効性のチェック
  • パスワードなどのGitに登録すべきでない情報がコミットされていないか?
  • yamlのフォーマットの整形
  • GoのLinterを複数まとめて実行
  • Goのテストコードを実行

などがあります。

SPONSORED LINK
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v2.2.3
    hooks:
      - id: pretty-format-json
        args: [--autofix, --no-ensure-ascii]
      - id: check-json
      - id: detect-private-key
      - id: check-yaml

  - repo: https://github.com/golangci/golangci-lint
    rev: v1.23.8
    hooks:
      - id: golangci-lint

  - repo: https://github.com/tekwizely/pre-commit-golang
    rev: master
    hooks:
    -   id: go-test-repo-mod

.golangci.yml を作成します。
有効化しているLinterはこちらのGoogleのプロジェクトを参考にしました。

linters:
  disable-all: true
  enable:
    - bodyclose
    - deadcode
    - dogsled
    - goconst
    - gocritic
    - goimports
    - golint
    - goprintffuncname
    - gosimple
    - govet
    - ineffassign
    - interfacer
    - maligned
    - nakedret
    - rowserrcheck
    - staticcheck
    - structcheck
    - stylecheck
    - typecheck
    - unconvert
    - unparam
    - unused
    - varcheck
    - whitespace

ここまで設定したら開発用コンテナをビルドして立ち上げます。

立ち上がったら、

pre-commit install

を実行し、gitのコミットフックを作成させます。
(すでにローカル側でコミットフックを生成していた場合は不要)

設定は以上です。
あとはコードを書いてコミットする際にpre-commitが良い仕事をしてくれるようになります。