【问题标题】:How to list all non-standard/custom packages in Go?如何在 Go 中列出所有非标准/自定义包?
【发布时间】:2020-02-13 18:21:47
【问题描述】:

here 所述,可以使用https://godoc.org/golang.org/x/tools/go/packagesLoad() 函数获取所有标准Go 包,其中可以提供“模式”作为输入。

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

例如,如果 pattern = "std" 则返回所有标准包。

但是,如果我想获取具有自定义模式的自定义/用户定义包的列表,例如只有 github.com/X/Y/vendor/... 形式的供应商文件夹,那么我该如何准确地指定模式?

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

【问题讨论】:

    标签: go go-packages


    【解决方案1】:

    您可以在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)
            }
        }
    }
    

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

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

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

    【讨论】:

    • 谢谢@norbjd!事实证明,除了我在问题本身中提到的... 之外,我已经尝试了所有组合。 :|顺便说一句,当我使用 ...vendor... 时,我没有得到预期的结果。但是对于...X... 等所有其他组合,我确实得到了预期的结果。你也是这样吗? vendor 有什么特别之处?
    • 如果您说的是vendor 目录(由go mod vendor 生成),它本身并不是一个包,它只是一个包含所有外部依赖项的本地副本的目录。
    猜你喜欢
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 2015-03-13
    相关资源
    最近更新 更多