登录
首页 >  Golang >  Go问答

获取模块名称的API

来源:stackoverflow

时间:2024-04-23 13:45:33 209浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《获取模块名称的API》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

是否有API可以获取使用go 1.11模块系统的项目的模块名称?

所以我需要从 go.mod 文件中的模块定义 module abc.com/a/m 获取 abc.com/a/m


解决方案


截至撰写本文时,我不知道有任何公开的 api。然而,查看 go mod 源代码,Go mod source file 中有一个非常有用的函数

// modulepath returns the module path from the gomod file text.
// if it cannot find a module path, it returns an empty string.
// it is tolerant of unrelated problems in the go.mod file.
func modulepath(mod []byte) string {
    //...
}

func main() {

    src := `
module github.com/you/hello

require rsc.io/quote v1.5.2
`

    mod := modulepath([]byte(src))
    fmt.println(mod)

}

哪个输出 github.com/you/hello

试试这个?

package main

import (
    "fmt"
    "io/ioutil"
    "os"

    modfile "golang.org/x/mod/modfile"
)

const (
    RED   = "\033[91m"
    RESET = "\033[0m"
)

func main() {
    modName := GetModuleName()
    fmt.Fprintf(os.Stdout, "modName=%+v\n", modName)
}

func exitf(beforeExitFunc func(), code int, format string, args ...interface{}) {
    beforeExitFunc()
    fmt.Fprintf(os.Stderr, RED+format+RESET, args...)
    os.Exit(code)
}

func GetModuleName() string {
    goModBytes, err := ioutil.ReadFile("go.mod")
    if err != nil {
        exitf(func() {}, 1, "%+v\n", err)
    }

    modName := modfile.ModulePath(goModBytes)
    fmt.Fprintf(os.Stdout, "modName=%+v\n", modName)

    return modName
}

今天关于《获取模块名称的API》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>