重构是那些你必须继续定期做的事情之一,以保持一个干净的代码库。这是那些不成文的软件开发规则之一。
最近,我们的一个项目需要进行一点重构,我们的目标并不惊人,它们有点简单(但也很复杂):重命名一些东西。基本上移动一些包,相应地更新进口,并将一些其他类型的包重命名为不同的包。
我们这样做的最终目的是为了使事情更加清晰,从领域的角度来看,并遵循其他大项目以及整个社区所遵循的一些Go惯例。具体来说,我们的计划是重新命名我们的包,以遵循项目布局的惯例,你可能喜欢也可能不喜欢或同意,最后我们评估了这些变化,我们没有看到任何关于这一变化的担忧。
关于这种重构的情况,最酷的是Go Project已经包括了帮助你这样做的工具。
安装
为了安装,你可以运行通常的。
go get -u golang.org/x/tools/...
这将带来所有的Go工具,然而对于这个特殊的练习,我们只需要一个新的工具 gomvpkg,以及众所周知的gofmt 。
gomvpkg
这个工具的工作方式是通过接受参数来指示from 、to ,以及用于移动文件的VCS命令,称为vcs_mv_cmd 。这个工具非常简单明了,而且非常高效。因此,假设你使用的是Git,并且你的目标是将你的软件包gitlab.com/MarioCarrion/fancy-package/oldname 移动到gitlab.com/MarioCarrion/fancy-package/newname ,你可以执行。
gomvpkg -from gitlab.com/MarioCarrion/fancy-package/oldname \
-to gitlab.com/MarioCarrion/fancy-package/newname \
-vcs_mv_cmd "git mv {{.Src}} {{.Dst}}"
这将更新所有使用你的oldname 包的 Go 文件,以使用newname (当然,有完整的导入地址),并将使用git mv 来移动实际的文件,所以你可以事后提交所有文件。
gofmt
这个工具非常强大,它的出现是因为我们遇到了一些情况,软件包不能正确重命名,这是因为我们对原始软件包进行了别名,基本上是这样。
import (
oname "gitlab.com/MarioCarrion/fancy-package/oldname"
)
所以所有使用oname 的文件都没有更新,幸好gofmt 帮助我们做了这个改变,基本上是这样的。
gofmt \
-r '"gitlab.com/MarioCarrion/fancy-package/oldname" -> "gitlab.com/MarioCarrion/fancy-package/newname"'
-w .
结论
平心而论,这个过程真的很顺利,而且这么容易就完成了,这只是证实了我的立场(再一次),我真的很喜欢Go,不仅是因为语言本身,还因为所有可用的工具都是根据真正的软件开发需要而编写的。