動作確認環境
- Ubuntu 18.04
- Go 1.14.2
macOSでも動くと思います。
背景
Go Toolsに含まれるgorenameは、様々な変数の名前を変更するためのツールで、リファクタリングなどに活用できます。
ただし、エクスポートされた変数の場合は、マシン内のワークスペース( $GOROOT
および $GOPATH
)をスキャンするという挙動があり、非常に時間がかかることがあるようです。
(参考)
$ gorename -help
:
gorename automatically computes the set of packages that might be
affected. For a local renaming, this is just the package specified by
-from or -offset, but for a potentially exported name, gorename scans
the workspace ($GOROOT and $GOPATH).
作成したシェルスクリプト
概要
そこで、モジュール開発時を想定して、以下のような操作を行うシェルスクリプトを書きました:
- GOPATHを設定するための一時ディレクトリを作成する
- 開発中のモジュールだけをそこにシンボリックで配置する
-
GOPATH=${一時ディレクトリ} gorename
コマンドを実行する - 置換が終わったら一時ディレクトリは削除
ソースはこちらです:
Requirements
- Bash
-
gorename
コマンド -
go.mod
があるディレクトリで実行すること。-
go.mod
の1行目にmodule ${moduleパス}
の記載がある想定
-
使い方
Syntax:
go-rename-dev [PATH].FROM_NAME TO_NAME [OPTIONS]
例:
go-rename-dev internal/logs.Log Logging
# gorename -from '"${module}/intenal/logs".Log' -to Logging
go-rename-dev .Conf Config -v
# gorename -from '"${module}".Conf' -to Config -v
上のコマンド例は、それぞれ内部的に直下のコメントアウトしてある gorename
コマンドを実行します。
実行例
$ pwd
/home/progrhyme/my/go/src/github.com/progrhyme/binq
$ go-rename-dev internal/cli.CLI.OutStream OutStr -v
+ GOPATH=/tmp/tmp.Stu5A9b9CX
+ gorename -from '"github.com/progrhyme/binq/internal/cli".CLI.OutStream' -to OutStr -v
gorename: -from spec: {pkg:github.com/progrhyme/binq/internal/cli fromName:OutStream searchFor: pkgMember:CLI typeMember:OutStream filename: offset:0}
gorename: Loading package: github.com/progrhyme/binq/internal/cli
gorename: Potentially global renaming; scanning workspace...
While scanning Go workspace:
Package "github.com": cannot find module providing package github.com: unrecognized import path "github.com": parse https://github.com/?go-get=1: no go-import meta tags ().
Package "github.com/progrhyme": cannot find module providing package github.com/progrhyme: invalid github.com/ import path "github.com/progrhyme".
gorename: Loading package: github.com/progrhyme/binq/internal/cli
gorename: Updating package github.com/progrhyme/binq/internal/cli
Renamed 4 occurrences in 1 file in 1 package.
+ set +x
若干、見慣れないようなエラーが出ているのが気になりますが(汗)、置換自体は上手く行っています。
効果
(Before)
最近 $HOME/go
に色々溜まっており、エクスポートされた変数名に対して gorename
を実行すると数分経っても結果が返って来ないので、諦めていました。
(After)
このラッパーコマンドを使うことで、多少の依存があるモジュールでrenameを実行しても30秒以内には終わるようになりました。
まとめ
gorename
を使って、エクスポートした変数名であっても短時間でリネームするためのシェルスクリプトを書きました。
同様のケースでお困りの方は、ご自由にご利用ください。