如何在 Go 中列出所有 non-standard/custom 个包?

How to list all non-standard/custom packages in Go?

如前所述,here one can get all the standard Go packages using https://godoc.org/golang.org/x/tools/go/packagesLoad() 函数可以将 "pattern" 作为输入。

pkgs, err := packages.Load(nil, pattern)

例如,如果 pattern = "std" 那么它 returns 所有标准包。

但是,如果我想获得 custom/user-defined 包的列表,这些包具有自定义模式,例如只有 github.com/X/Y/vendor/... 形式的供应商文件夹,那么我如何才能准确指定模式?

我尝试在 Load() 函数中使用 /vendor/github.com/X/Y/vendor/ 和其他一些组合作为 pattern。 None 其中有效。

您可以在 Load() 函数的 pattern 字段中使用 ... 语法。

例子

我的 Go 模块需要 github.com/hashicorp/go-multierror 包:

module mymodule

require github.com/hashicorp/go-multierror v1.0.0

所以,下面的代码:

package main

import (
    "fmt"
    "golang.org/x/tools/go/packages"
)

func main() {
    pkgs, err := packages.Load(nil, "github.com/hashicorp...")
    if err == nil {
        for _, pkg := range pkgs {
            fmt.Println(pkg.ID)
        }
    }
}

returns 以 github.com/hashicorp 开头的所有必需包(甚至是传递包):

github.com/hashicorp/errwrap
github.com/hashicorp/go-multierror

请注意,您还可以在模式中的任何位置使用 ......hashicorp......ha...corp...github.com/...)。