エンジニアはこわくない

雑記とかエンジニアっぽい内容を好きなように書く場所

golangでvetコマンドやtestコマンドを実行したときにvendorディレクトリを除外する方法


スポンサーリンク

f:id:tsujitaku50:20170224131252j:plain

下記の記事で書いたように、golangでディレクトリ(プロジェクト)をまるごとvetやtestしていると、たまに困ったことが起きるようになりました。 tsujitaku50.hatenablog.com

それは

「ディレクトリ(プロジェクト)をまるごとvetやtestしていると、vendorディレクトリも一緒にvetやtestする」

ということです。

つまりvendorディレクトリ配下にエラーが起きるようなコードが含まれている場合、それも同時に検出されてしまうということです。

これはめんどくさい。

できればvendorディレクトリだけ除外したいですよね。

ということで、調べました!

vendorディレクトリを除外して、プロジェクト(ディレクトリ)まるごとvetやtestするコマンドは

下記になります!

go vet $(go list ./... | grep -v /vendor/) 

少し上記のコマンドについて説明すると、

まずgo listコマンドですが、これはインポートパスを表示します。

上記の例では

go list ./...

としているので、ディレクトリ以下全てのインポートパスを表示しているのでvendorディレクトリも含まれています。

そしてgrepコマンドのオプションが-vでvendorディレクトリを除外しています。

これで「vendorディレクトリを除外したインポートパス」が表示されます。

そして「vendorディレクトリを除外したインポートパス」に対してgo vetしているので

vendorディレクトリを除外した全てのファイルに対してgo vet出来るというわけです。

普段go listコマンドをまったく使わないので、「このコマンドなんのためにあるんだろう」と思っていたのですが

まさかこんな形で使えるとは。。!

あとはjenkinsなどでプッシュしたときや、プルリクを出したときに上記コマンドを仕込んだジョブが動くように設定してけば

自動テストの一種になると思います。

おわり!!