cmd/go: list the Go resources in a physical directory

a2mppw5e  于 4个月前  发布在  Go
关注(0)|答案(4)|浏览(38)

go 1.11/1.12
许多Go项目已经使用GOPATH的历史解包文件系统属性将Go源文件与其他内容(人类文档md文件,非Go资源文件等)混合在一起。
在模块模式下,这种混合是没有意义的,因为Go编译器是唯一足够智能地定位和访问模块zip文件内容的东西。
因此,需要检查现有的Go项目树,将Go项目源文件与其他内容分开。而且你遇到了一个引导问题,因为在模块模式下不使用GOPATH,而检查的目的是确定哪些内容最终应该放在zip文件中,哪些应该放在其他地方,所以此时项目不再位于GOPATH中,但尚未进入zip模块。
有没有一种方法可以让Go问:“告诉我这个目录的哪个部分对构建者有用,应该放在zip模块中,哪些部分需要以其他方式公开?”
除了递归调用exec.Command("go", "list", "-f"…, ".")之外还有其他方法吗?
(当然,一个人可以毫不客气地将整个树压缩并查看之后会发生什么,但这并不是切换到模块的有效方法)

ctehm74n

ctehm74n1#

我怀疑你要找的命令是:

go list -f '{{.Dir}}' $(dirname $(go env GOMOD))/...
tag5nh1u

tag5nh1u2#

嗯,这并不严格足够:它不会告诉你testdata将包含什么,例如。
CC @jayconrod@ianthehat@matloob

omvjsjqw

omvjsjqw3#

相关 [#28835](https://github.com/golang/go/issues/28835)
tmb3ates

tmb3ates4#

呃,除非我漏掉了什么:

  • 不能使用 GOMOD ,因为项目尚未转换为模块
  • go list -f '{{.Dir}}' 会给出包列表,但不会对包目录中的文件进行排序,以确定哪些文件应该放在模块中,哪些文件不应该

因此,您可能需要切换到模块目录根(因为否则 go list 只能检查目标目录之外的其他内容),并使用类似

go list -f '{{$d := .Dir}}{{range $f := .GoFiles}}{{printf "%s/%s\n" $d $f}}{{end}}}{{range $f := .CgoFiles}}{{printf "%s/%s\n" $d $f}}{{end}}{{range $f := .CFiles}}{{range $f := .CXXFiles}}{{printf "%s/%s\n" $d $f}}{{end}}{{printf "%s/%s\n" $d $f}}{{end}}{{range $f := .TestGoFiles}}{{printf "%s/%s\n" $d $f}}{{end}}' ./...

的命令,这并不是非常方便(而且它甚至不完整,还有其他类型的源文件需要添加)
从 Go 程序中执行 os.exec go list 也不太优雅。

相关问题