概要

昨今の開発環境はほとんどのロジェクトでDocker Composeなどの仮想環境で構成されています。
今回は、Neovim(Vim) + ALEを使ってDocker Compose上でRubocopを実行する方法を書きました。

バージョン

  • Neovim: v0.6.0
  • ALE: v3.1.0
  • Docker Compose: 1.24.0

設定方法

前提として、ALEプラグインをインストール済みの状態であることとします。

まず、Railsのbinstubとしてbin/rubocopにDocker Compose上でRubocopを実行するスクリプトを作成します。

#!/usr/bin/env ruby

require 'pathname'
require 'fileutils'

include FileUtils

APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)

chdir APP_ROOT do
  rubocop_command = "bundle exec rubocop #{ARGV.join(' ')}"
  system("docker-compose exec -T app #{rubocop_command}'")
end

ALEはRubocopの結果をJSON形式で受け取って処理します。その際、標準出力に余計な出力がないよう、docker-compose execコマンドに-Tオプションを指定しています。

Neovimの設定

最後にNeovimの設定をします。
開発環境はプロジェクトによって異なるので、僕はthinca/vim-localrcを使って.local.vimrcに設定をしています。

1. 実行コマンドにbin/rubocopを指定
let g:ale_ruby_rubocop_executable = 'bin/rubocop'

こちらは説明不要ですね。

2. ファイル名のマッピング
let g:ale_filename_mappings = {
  \ 'rubocop': [
  \   ['/Users/kseki/rails-project', '/opt'],
  \ ],
  \}

そのままだとローカルの絶対パスをbin/rubocopコマンドの引数として渡してしまうが、実行するのはDocker上です。 Docker上の絶対パスに変換してから渡すようにマッピング指定をします。 ['/Users/kseki/rails-project', '/opt'] の部分です。左はローカルのプロジェクトルートパス、右はDocker上のプロジェクトルートパスです。

まとめ

Gistにまとめました! Setting up “Rubocop” to run on “Docker compose” using “ALE”

参考