Help us understand the problem. What is going on with this article?

gorenameでexportした変数名でも短時間でリネームするためのシェルスクリプトを書いた

動作確認環境

  • 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 を使って、エクスポートした変数名であっても短時間でリネームするためのシェルスクリプトを書きました。
同様のケースでお困りの方は、ご自由にご利用ください。

progrhyme
Software Engineer. Was @key-amb
https://progrhy.me/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away