golangのimport順を並び替えるツールを作った

tl;dr;

github.com

 

やりたいこと

標準ライブラリ→3rd partyライブラリ→ローカルライブラリの順に並べたい

 

goimportsつかえよという声が聞こえてきそうですが

goimports、おおむね良いのです。たとえば、

 

 import (
    "github.com/ziutek/blas"
    "math"
    d "./data"
   "fmt"
)

に対して*1goimports使うと、

 

import (
    "fmt"
    "math"

 

    "github.com/ziutek/blas"

 

    d "./data"
)

 になって素敵です。

 

でも、変換元が

 

import (
    "github.com/ziutek/blas"
    "math"

 

    d "./data"
    "fmt"
)

 のとき(mathの後ろに一行空行がある)、

import (
    "math"

 

    "github.com/ziutek/blas"

 

    "fmt"

 

    d "./data"
)

 になっちゃうんです。これ、IDE使っていると一番下の行に挿入されるので容易に順番が崩れちゃうんですが、同じ要望を持ってる人どうしてるんですかね?

 

作ったもの

ゆるいツールを作りました。mukagoと名付けていますが適当です。

importの順を並び替えるだけですが、GolangのASTがよくわからなくて、結構ハマりました。

mukagoを使うと、上記の状態でも、

import (
    "fmt"
    "math"

 

    "github.com/ziutek/blas"

 

    d "./data"

 になって幸せです。

まとめ

かなり雑な作りなので、同じ機能をもったもっとちゃんとしているものがあったら使いたいです。探した限り見当たりませんでしたが…

*1: 相対パスimportは諸々の都合上例としてそうなっていますが通常行いません。