bonjour被卸载了会怎样(bonjour被卸载了会怎样win)

最近有很多读者朋友和朋友交朋友bonjour卸载后会什么疑问?有网友整理了相关内容,希望能回答你的疑惑。bonjour卸载会怎样?win,这个网站也为你找到了问题的答案,希望对你有所帮助。

Go 语言中一直受到批评的问题之一是没有更好的依赖管理系统,GOPATH 开发者一直抱怨设计 Go 在语言快速发展的过程中,也出现了一些优秀的依赖管理工具,如 govendor、dep、glide 等等,有些几乎成了半官方工具,但这些工具仍然需要依赖 GOPATH,为了彻底解决这个祸水, Go1.11 的发布,Golang 官员给我们带来了依赖管理的新特征Go Modules,这是 Golang 全新的依赖管理体系。让我们来看看 Go Modules 如何使用。

bonjour被卸载了会怎样(bonjour被卸载了会怎样win)

新建 Module

要使用 Go Modules 首先,你需要在环境中确保你的环境 Golang 版本大于1.11:

$ go versiongo version go1.11.4 darwin/amd64

我们说 Go Modules 主要是消除 GOPATH 的,因此,我们的新项目根本不需要放在那里$GOPATH/src目录下面,任何地方都可以:

$ echo $GOPATH/Users/ych/devs/projects/go/

我们在目录/目录/Users/ych/devs/projects为测试创建一个工作目录:

$ pwd/Users/ych/devs/projects$ mkdir stardust && cd stardust

在 stardust 在字符串操作目录下创建一个目录 stringsx 的包:

$ mkdir stringsx && cd stringsx

在包 stringsx 下面创建一个 string.go 的文件:

package stringsximport ( “fmt”)func Hello(name string) string{return fmt.Sprintf(“Hello, %s”, name), nil}

现在我们包里的代码已经准备好了,但还不是一个模块,我们需要使用它 Go Modules 做一些工作:

$ export GO111MODULE=on # 开启GoModule特性

然后在项目根目录下初始化 Go Module:

$ pwd/Users/ych/devs/projects/stardust$ go mod init github.com/cnych/stardustgo: creating new go.mod: module github.com/cnych/stardust

这里有一个命令:go mod init 模块名,该命令将在当前目录下生成go.mod文件生成的内容是包含模块名称的声明:

module github.com/cnych/stardust

请注意,模块名非常重要,这相当于声明我们的模块名称。如果我们将来想使用这个模块,我们需要使用这个名称来获取模块。

这一步很简单,但是把我们现在的包变成了一个 Module 现在我们可以把这个代码推到代码仓库,我在这里用 Github,仓库地址:https://github.com/cnych/stardust

$ git init$ git add .$ git commit -am “add stringsx package content”$ git remote add origin git@github.com:cnych/stardust.git$ git push -u origin master

在这里,我们完成了最简单的一个 Go Module 的编写,任何其他想要使用我们模块的开发者都可以通过go get命令来获取:

$ go get github.com/cnych/stardust

但上述命令是获取的 master 当然,分支的最新代码没有问题,但不是最好的实践方式,因为我们的模块很可能会有新的内容更新,或者有一些 BUG 如果我们都需要修理,如果我们都把它放在那里 master 在分支上,必然会造成用户的混乱,因为很有可能用户的代码在我们的模块更新后不兼容,但不用担心,Go Moduels 这个版本的问题可以很好的解决。

Module 版本管理

Go Modules 需要版本化管理,就像我们通常用不同的版本来区分代码一样。对于 Go Modules 强烈建议使用语义化版本控制。对于语义化版本控制,我们查看响应的文档描述:https://semver.org,主要版本规则如下:

版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

  • 主版本号:当你做不兼容的时候 API 修改,
  • 次版本号:当您添加向下兼容功能时,
  • 修订号:当你做向下兼容的问题时。

先行版本号和版本编译元数据可添加到主版本号.次版本号.以修订号为延伸。

我们在使用 Go Modules 在寻找版本时,将使用仓库中的版本 tags,而且有些版本和其他版本有一些区别,比如 v2 或者更高的版本要和 v1 版本模块的导入路径应该不同,以便通过模块区分不同版本的使用。当然,默认情况下,Golang 在仓库里获得最新的 tag 版本。

所以最重要的是发布我们的模块,我们需要使用它 git tag 标记我们的仓库版本。

发布第一个版本

如果我们的包现在准备好了,可以发布 release 首先,我们需要给当前的包打一个包 git tag,记住使用语义版,例如,们这里的第一个版本叫:v1.0.0:

$ git tag v1.0.0$ git push –tags

bonjour被卸载了会怎样(bonjour被卸载了会怎样win)

git tag

这样我们就会在那里 Github 上面创建了一个名字 v1.0.0 的 tag,但更好的方法是创建一个名字v1的新分支,方便以后修复当前版本代码 BUG,也不会影响 master 或者其他分支的一些代码:

$ git checkout -b v1$ git push -u origin v1

现在我们不必担心它会影响我们以前的版本。

模块使用

现在我们的模块已经准备好了,现在让我们创建一个使用上述模块的简单程序:

$ pwd/Users/ych/devs/projects$ mkdir ch26-gomodules && cd ch26-gomodules

然后在 ch26-gomodules 在目录下创建一个 main.go 的文件:

package mainimport (“fmt””github.com/cnych/stardust/stringsx”)func main(){fmt.Println(stringsx.Hello(“cnych”))}

在程序中使用github.com/cnych/stardust/stringsx这个包,在过去,我们直接使用它go get命令把包拉到 GOPATH 或者 vendor 以下是目录。现在我们把这个包当作包。 modules 首先,在当前目录下初始化模块:

$ go mod init ch26-gomodules

同样的,该命令将在目录下新建go.mod的文件:

module ch26-gomodules

此时,我们将直接运行我们当前的程序:

$ go run main.gogo: finding github.com/cnych/stardust v1.0.0go: downloading github.com/cnych/stardust v1.0.0Hello, cnych

上述命令将自动下载程序中导入的包,下载后可以查看go.mod文件内容:

module ch26-gomodulesrequire github.com/cnych/stardust v1.0.0

它还在当前目录下生成了一个名字go.sum新文件包含一些依赖包 hash 信息,可用于保证文件和版本的正确性:

github.com/cnych/stardust v1.0.0 h1:8EcmmpIoIxq2VrzXdkwUYTD4OcMnYlZuLgNntZ DxUE=github.com/cnych/stardust v1.0.0/go.mod h1:Qgo0xT9MhtGo0zz48gnmbT9XjO/9kuuWKIOIKVqAv28=

下载模块$GOPATH/pkg/mod以下目录:

$ ls $GOPATH/pkg/mod/github.com/cnych stardust@v1.0.0

这样,我们就成功地使用了我们上面写的东西 v1.0.0 版本的 github.com/cnych/stardust 这个模块。

发布一个 bugfix 版本

例如,我们现在在模块中发现了以前的模块 Hello 函数有 bug,因此,我们需要修复并发布一个新版本:

func Hello(name string) string{return fmt.Sprintf(“Hello, %s!

发布一个 bugfix 版本

例如,我们现在在模块中发现了以前的模块 Hello 函数有 bug,因此,我们需要修复并发布一个新版本:

func Hello(name string) string{return fmt.Sprintf(“Hello, %s!!!”, name)}

我们在这里加3个!来模拟 bugfix。

当然要注意我们在这里v这个分支上来了 fix,fix 完成后再 merge 到 master 以上分支,然后发布新版本,遵循语义版本规则,我们在这里修改 bug,因此,只需添加修正版本号即可,比如命名为 v1.0.1 版本:

$ git add .$ git commit -m “fix Hello function #123″$ git tag v1.0.1$ git push –tags origin v1

    这样,我们就发布了修改版本的模块。

  • 更新 modules
  • 默认情况下,Golang 不会自动更新模块。如果自动更新,会不会造成依赖管理的混乱?因此,我们需要清楚地告诉你 Golang 我们需要更新模块,我们可以通过以下方式更新模块:

运行go get -u xxx命令获取最新模块(例如,如果我们在这里执行,我们将从v1.0.0更新到v1.0.1版本)

运行go get package@version将命令更新到指定版本的模块

直接更新go.mod模块依赖于文件中的版本,然后执行go mod tidy更新命令

当我们在这里使用任何方法时,例如使用第二种方法:

$ go get github.com/cnych/stardust@v1.0.1

更新完成后,可以查看go.mod依赖模块的版本变化:

module ch26-gomodulesrequire github.com/cnych/stardust v1.0.1这个时候同样可以查看下 mod 文件夹下面的模块:

$ ls $GOPATH/pkg/mod/github.com/cnychstardust@v1.0.0 stardust@v1.0.1

看到这里我们是不是就明白 Go Modules 是通过怎样的方式来进行版本控制的了?每个版本都是独立的文件夹,这样是不是就不会出现版本冲突了。

主版本升级

根据语义化版本规则,主版本升级是不向后兼容的,从 Go Modules 的角度来看,主版本是一个完全不同的模块了,因为我们认为两个大版本之间是互相不兼容的,那么我们怎么设计 Go Modules 来支持两个大版本呢?比如现在我们来修改下模块中的 Hello 函数,增加对语言的一个支持:

func Hello(name, lang string) (string, error) {switch lang {case “en”:return fmt.Sprintf(“Hi, %s!”, name), nilcase “zh”:return fmt.Sprintf(“你好, %s!”, name), nilcase “fr”:return fmt.Sprintf(“Bonjour, %s!”, name), nildefault:return “”, fmt.Errorf(“unknow language”)}}

记住要切换到 master 分支进行修改,因为 v1 分支和我们现在修改的内容是完全不同的版本了。

这里我们的函数需要两个参数,返回也是两个参数,直接按照之前 v1 版本中的函数使用肯定是会出错的,所以我们这里新版本的模块就不打算再去兼容之前 1.x 的模块了,这个时候我们需要更新版本到 v2.0.0,那么怎么去区分这两个大版本呢?这个时候我们去更改 v2 版本的模块路径就可以了,比如变成github.com/cnych/stardust/v2,这样 v2 版本的模块和之前 v1 版本的模块就是两个完全不同的模块了,我们在使用新版本的模块的时候只需要在模块名称后面添加上 v2 就可以了。

module github.com/cnych/stardust/v2

接下来和前面的操作一样的,给当前版本添加一个名为 v2.0.0 的 git tag,当然最好还是创建一个名为 v2 的分支,这样可以将版本之间的影响降到最低:

$ git add .$ git commit -m “change Hello function to support lang”$ git checkout -b v2$ git tag v2.0.0$ git push origin v2 –tags

这样我们 v2 版本的模块就发布成功了,而且之前我们的程序也不会有任何的影响,因为他还是可以继续使用现有的 v1.0.1 版本,而且使用go get -u命令也不会拉取最新的 v2.0.0 版本代码,但是如果对于使用的用户来说,现在要想使用 v2.0.0 版本的模块怎么办呢?

其实很简单,只需要单独引入 v2 版本的模块即可:

package mainimport (“fmt””github.com/cnych/stardust/stringsx”stringsV2 “github.com/cnych/stardust/v2/stringsx”)func main() {fmt.Println(stringsx.Hello(“cnych”))if greet, err :=stringsV2.Hello(“cnych”, “zh”); err !=nil {fmt.Println(err)} else {fmt.Println(greet)}}

这个时候我们去执行go run main.go命令当然同样的会去自动拉取github.com/cnych/stardust/v2这个模块的代码了:

$ go run main.gogo: finding github.com/cnych/stardust/v2 v2.0.0go: downloading github.com/cnych/stardust/v2 v1.0.0Hi, cnych!!!你好, cnych!

这样我们在同一个 go 文件中就使用了两个不兼容版本的模块。同样这个时候再次查看下go.mod文件的变化:

module ch26-gomodulesrequire github.com/cnych/stardust v1.0.1require github.com/cnych/stardust/v2 v2.0.0默认情况下,Golang 是不会从go.mod文件中删除依赖项的,如果我们有不使用的一些依赖项需要清理,可以使用 tidy 命令:

$ go mod tidy

该命令会清除没有使用的模块,也会更新模块到指定的最新版本。

Vendor

Go Modules 默认会忽略vendor/这个目录,但是如果我们还想将依赖放入 vendor 目录的话,我们可以执行下面的命令:

$ go mod vendor

    该命令会在项目根目录下面创建一个vendor/的文件夹,里面会包含所有的依赖模块代码,并且会在该目录下面添加一个名为modules.txt的文件,用来记录依赖包的一些信息,比较类似于 govendor 中的 vendor.json 文件。

  • 不过建议还是不要使用该命令,尽量去忘掉 vendor 的存在,如果有一些依赖包下载不下来的,我们可以使用GOPROXY这个参数来设置模块代理,比如:

  • $ export GOPROXY=”https://goproxy.io”

阿里云也提供了 Go Modules 代理仓库服务:http://mirrors.aliyun.com/goproxy/,使用很简单就两步:

1.使用 go1.11 以上版本并开启 go module机制:export GO111MODULE=on

2.导出GOPROXY环境变量:export GOPROXY=https://mirrors.aliyun.com/goproxy/

如果你想上面的配置始终生效,可以将这两条命令添加到.bashrc中去。

除了使用公有的 Go Modules 代理仓库服务之外,很多时候我们在公司内部需要搭建私有的代理服务,特别是在使用 CI/CD 的时候,如果有一个私有代理仓库服务,会大大的提供应用的构建效率。

我们可以使用Athens来搭建私有的代理仓库服务,搭建非常简单,直接用 docker 镜像运行一个服务即可:

export ATHENS_STORAGE=~/athens-storagemkdir -p $ATHENS_STORAGEdocker run -d -v $ATHENS_STORAGE:/var/lib/athens \ -e ATHENS_DISK_STORAGE_ROOT=/var/lib/athens \ -e ATHENS_STORAGE_TYPE=disk \ –name goproxy \ –restart always \ -p 3000:3000 \ gomods/athens:latest其中 ATHENS_STORAGE 是用来存放我们下载下来的模块的本地路径,另外 ATHENS 还支持其他类型的存储,比如 内存, AWS S3 或 Minio,都是 OK 的。

然后修改 GOPROXY 配置:export GOPROXY=http://127.0.0.1:3000

总结

    一句话:

  • Go Modules 真的用起来非常爽
  • ,特别是消除了GOPATH,这个东西对于 Golang 初学者来说是非常烦人的,很难理解为什么需要进入到特定目录下面才可以编写 Go 代码,现在不用担心了,直接使用Go Modules就行。

  • 参考资料

https://blog.golang.org/using-go-modules

https://roberto.selbach.ca/intro-to-go-modules/https://semver.org/lang/zh-CN/

主题测试文章,只做测试使用。发布者:艾迪号,转转请注明出处:https://www.cqaedi.cn/baike/38633.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年 1月 10日 上午12:04
下一篇 2023年 1月 10日 上午12:41

相关推荐

  • 陕西师范大学是985或者211嘛(陕西师范大学是985或者211嘛谷氨酸的等电点)

    最近有很多读者朋友对陕西师范大学是985或者211嘛有疑问。由部分网友整理出相关内容希望能够解答你的疑惑,关于陕西师范大学是985或者211嘛谷氨酸的等电点,本站也已经为你找到了问题的答案,希望能帮助到你。 直到看见录取分数线之前,八十年代的老大学生刘刚都想不明白,考了高分的儿子为何要报考师范类大学。他清楚地记得,在自己参加高考的1980年代,有两类学校没人…

    百科大全 2023年 4月 14日
    00
  • 1080功耗,1080显卡满载功耗

    “1080功耗”是指NVIDIA GeForce GTX 1080显卡的功耗性能。作为一款高性能显卡,1080功耗备受关注。这款显卡采用了Pascal架构,拥有2560个CUDA核心和8GB GDDR5X显存,能够提供出色的图形处理性能。随着性能的提升,功耗也成为了一个不可忽视的问题。为了保持显卡的稳定工作状态,厂商对1080功耗进行…

    百科大全 2023年 7月 1日
    00
  • 团员证有什么用(共青团员证有什么用)

    最近有很多读者朋友对团员证有什么用有疑问。有网友整理了相关内容,希望能回答你的疑惑。这个网站已经为你找到了关于共青团成员证书有什么用的问题的答案,希望对你有所帮助。 文字/樱花谈教育 (欢迎转载分享原创文章) 2021年高考已经结束,录取通知书陆续发给考生。 很多人认为拿到录取书就可以万事大吉了。事实上,这是一个很大的错误。学生必须在开学前准备必要的材料。他…

    百科大全 2023年 3月 4日
    00
  • 宇文邕怎么读(宇文邕 怎么读)

    据国防大学出版社《中国皇帝史》载:从秦始皇统一中国到清代宣统覆灭,我国封建社会共经历了352名皇帝,其中统一朝代的皇帝有146名。分裂时期的皇帝有206名,主要是三国、南北朝、五代十国时期。如果把秦始皇以前历时840年的东、西周朝和春秋、战国时代之王、公、侯加进去,就更多了,这些君王总共121位,公217位,侯23位。若再把周朝以前的商朝、夏朝60帝也算进去…

    2023年 5月 4日
    00
  • 股票持仓里出现配债怎么处理(股票配债是好事还是坏事)

    小王炒股已经有1年多了,昨天出现了一个奇怪的事情,突然发现自己的股票账户持仓明细中多出了“XX配债”。小王开始纳闷了,可是最近自己并没有买卖过任何债券,怎么就出现了配债呢? 股票配债 一、何为股票配债? 股票配债是上市公司在发行可转换债券时,依据股东的持股数和配售比例,向原股东配售一定债券的行为。是上市公司给予股东的一种权利,股东可以优先选择是否购买公司的可…

    2023年 5月 15日
    00

站长QQ

7401002

在线咨询: QQ交谈

邮件:7401002@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信