emahiro/b.log

日々の勉強の記録とか育児の記録とか。

goimportsでlocalのパッケージのsort順序を編集する。

-local付きでgoimportsする

goのformatとimportパッケージをよしなにしてくれる goimports コマンドですが、localで独自に定義したpackageをimportするときにこんな風に並んでほしいことが多いです。

import(
  // 標準pkg
  
  // github.comとか有名所pkg
  
  // localの独自pkg
)

goimportsは何も指定しないと https://github.com/golang/tools/blob/165bdd618e6d174c61ee7bd73a28f3e5c6fdced1/imports/fix.go#L44-L67 で示された順序で import の内部をsortします。

ここでは https://github.com/golang/tools/blob/165bdd618e6d174c61ee7bd73a28f3e5c6fdced1/imports/fix.go#L48 にあるようにlocalで定義されているpackageのPrefixを指定してあげます。

以下のようにして goimports を叩きます。

goimports -w -local "localのpackage名" foo.go

-w オプションはgoimportsをかけた出力結果でgoのファイルを上書きするオプションです。

注) importをsortするときは一度importの中から改行を消します。
どういうことかというと以下のような感じです。

import(
  "fmt"
  
  "bar"  
  
  "github.com/foo"

)

みたいに整列されているのを

import(
  "fmt" 
  "bar"  
  "github.com/foo"
)

こうして改行を削除して goimports をかけると

import(
  "fmt"
  
  "github.com/foo"
  
  "bar"  
)

こんな普通に意図した結果で sortされるはずです。
bar はlocalのカスタムpkg

なぜ改行を一度外すかと言うと、goimportsは改行があるとすでにgrouping済みと認識してしまい、意図したsortをしない可能性があるからです。

intellij(jetbrains系IDE)での設定

intellijでは以下のように設定するとうまくいきます。
Preference > Tools > ExternalTools > (+) でカスタムコマンド作成

以下のように設定します。この設定した External ToolsにKeymapでショートカットとか割り当てておけば、コード書き終わったあとにgoimportsをかけてソートします。

f:id:ema_hiro:20180608012237p:plain

Working Directory はこのコマンドが動作するディレクトリの範囲を決めることができます。

引数定義の中身は以下

f:id:ema_hiro:20180608012243p:plain

追記

Intellijでは Plugin から FIle Watchers をDLします。これでFileのSaveをHookして任意のスクリプトなり、actionを指定することができます。
上記の設定と同様の設定をFile Watchersに設定したので Cmd + S でFileを保存したときによしなに imports を聞かせることができるようになりました。