如何获取 Go 模块依赖项的路径?

我有两个Go模块,让我们将它们命名为.example.com/aexample.com/b


让它成为 :example.com/ago.mod


module example.com/a


go 1.12


require (

  example.com/b v0.4.2

)

在 的根目录中,有一个名为 的文件。 需要自动生成一些代码作为其构建过程的一部分。此自动生成需要读取 。example.com/bdata.yamlexample.com/adata.yaml


我怎样才能在查询的目录中为路径读取该文件?我知道下载后,模块将位于某个地方,但我不知道如何从那里构造路径,因为它包含一些不属于导入路径的字符。我希望有一些子命令或将输出路径,但我在文档中没有找到它。example.com/aexample.com/b(go env GOPATH)/pkg/mod!go modgo list


我已经考虑过通过包含在Go代码中(是的,我知道,但我现在不想需要Go 1.16),但是当我在编译时需要它时,我只能在运行时访问。data.yamlgo-bindata//go:embed


繁花不似锦
浏览 130回答 2
2回答

慕桂英546537

您可以像这样与标志和标志一起使用:go list-m-fgo list -m -f '{{.Dir}}' example.com/b旗帜:-m导致 go list 列出模块而不是包。在这种模式下,去列表的参数可以是模块,模块模式(包含...通配符)、版本查询或特殊模式 all,它与构建列表中的所有模块匹配。如果未指定任何参数,则列出主模块。(参考)旗帜:-f使用包模板的语法指定输出的备用格式。使用标志时,传递给模板的结构为:-mtype Module struct {    Path      string       // module path    Version   string       // module version    Versions  []string     // available module versions (with -versions)    Replace   *Module      // replaced by this module    Time      *time.Time   // time version was created    Update    *Module      // available update, if any (with -u)    Main      bool         // is this the main module?    Indirect  bool         // is this module only an indirect dependency of main module?    Dir       string       // directory holding files for this module, if any    GoMod     string       // path to go.mod file for this module, if any    GoVersion string       // go version used in module    Error     *ModuleError // error loading module }type ModuleError struct {    Err string // the error itself}

jeck猫

您可以像这样计算出模块路径:package mainimport (    "fmt"    "os"    "path"    "golang.org/x/mod/module")func GetModulePath(name, version string) (string, error) {    // first we need GOMODCACHE    cache, ok := os.LookupEnv("GOMODCACHE")    if !ok {        cache = path.Join(os.Getenv("GOPATH"), "pkg", "mod")    }    // then we need to escape path    escapedPath, err := module.EscapePath(name)    if err != nil {        return "", err    }    // version also    escapedVersion, err := module.EscapeVersion(version)    if err != nil {        return "", err    }    return path.Join(cache, escapedPath+"@"+escapedVersion), nil}func main() {    var path, err = GetModulePath("github.com/jakubDoka/mlok", "v0.4.7")    if err != nil {        panic(err)    }    if _, err := os.Stat(path); os.IsNotExist(err) {        fmt.Println("you don't have this module/version installed")    }    fmt.Println("module found in", path)}
打开App,查看更多内容
随时随地看视频慕课网APP