问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

golangvendor

发布网友 发布时间:2024-09-17 08:35

我来回答

1个回答

热心网友 时间:2024-09-28 05:48

golang的GOPATH和vendor的搜索关系

golang的GOPATH和vendor的搜索关系

项目只有一个包,即main包,没有引用其他的包(golang自带的系统包除外)。

然后设置GOPATH=path/to/goproject,再运行gobuildmyproject,这样就可以在任何目录下面编译,编译生成的可执行文件就在编译所在的目录下,而不是包源文件所在的目录。

基本规则:

鉴于此,建议golang项目必须严格按照规范的目录结构组织,哪怕是前面这种自包含的项目。

基本规则:

如果一个包在vendor和GOPATH下面都存在那么谁会优先使用呢。

结论是:

包mydeps在vendor目录下面和GOPATH路径下面都存在了,那么main.go引用的时候只会引用vendor下面的mydeps(src/myproject/vendor/mydeps),而忽略GOPATH下面的mydeps包(src/mydeps)。

前面提到GOPATH和PATH类似,可以包含多个路径,中间用分号隔开,go在搜索包的时候会按手续从前往后搜搜。那么vendor怎么处理层级关系呢。

规则是:

举例:

如果src/mydep/mydep1/mydep.go引用了myvendor1和myvendor,那是怎么搜索的呢

Go语言有什么好用的IDE吗

我喜欢jetbrains系列的IDE+go插件。不过我要说的是这个问题主要看你的观点如何。

说eclipse:

构建方式是使用goinstall命令,每一次编译运行都是goinstall。这样的好处就是如果你有很多的包,下载下来并没有编译,这样每次编译速度是很快的。而且(!)goinstall符合go官方的项目结构,官方说过了,一个go的项目应该是以个gopath,包含src,pkg,bin三个主要目录。所以说goinstall个人认为才是主要的go编译方式。

说eclipse的缺点:

其实eclipse插件的go编译方式,还有目录结构,项目结构,都是非常完美的!!!!真的很完美!可是,他的代码提示,太差件!大括号都不能自动补全,gdb32bit64bit兼容问题,eclipseC++没有htmljs插件,需要手动安装,几乎不能开箱即用。不过如果你是开发算法,数据处理,还是推荐eclipse的,毕竟其他都无关紧要。

说jetbrains:

说先说clione肯定不适合,新建项目没有向导,导致改成go项目各种不开心,比如图标对于我来说就无法接受golib不是小耗子~这是次要的,重要的是各个文件都是灰色的(没有在cmake中包含的结果),然后说剩下的,phpstorm这个不说了,估计很少有人插件按在这里,webstorm,体验也不是很好,idea?体验很好,可是毕竟比较重,尤其是现在加入了自家的K啥玩意(无意冒犯,没记住单词)~可是话说回来,go跟C系列IDE配合才是最佳,跟java系列一点不搭关系,用idea似乎有点格格不入,但是!idea支持新建项目向导,lib的图标也很清晰,最后还是选择idea吧,期待clion的强大起来!

再说jetbrains系列缺点:

插件的构建方式是gobuiild这个让人很不爽,我们几乎不确定会构建到什么地方去,还要每次设置一下run配置。这个可能无关紧要,毕竟不是什么大的毛病,可是gobuild不能缓存.a文件,直接构建的结果就是很多第三方包的情况下很慢!所以建议安装包的时候手动install一下解决这个问题。自带代码格式化,这个格式化跟go格格不入,总的来说就是蛋疼,心碎,菊花痒。

最后说liteIDE:

轻量级IDE,我可以说是国人GO伟大作品典范,然而默认构建也是gobuild,项目管理方式不符合go官方标准。代码提示不能自动导入(eclipse也不能),不过如果你的项目是以包为单位的,那么另当别论。一定很不错,毕竟是轻量级专门针对GO的IDE!

说这些,其实还有很大一部分取决于你的项目是用vendor机制管理,还是godeps机制管理依赖关系。go不像java拥有强大的几乎天下一统的maven(无意冒犯,暂不评价其他构建套件)。

go没有官方包仓库。

go没有官方包管理工具。

go没有官方自动化构建套件。

上面三个没有是致命要害。导致民间各种百花齐放。

说说我的项目怎么管理

gpm一个shell工具(windows下你可以用git的bash,或者cygwin~)

我是严格艳照官方推荐方式管理go项目,一个go项目一个gopath。系统的gopath只是为了安装go命令,我没有配置gobin,意义不大。

项目的依赖跟我的代码包都在src下(非vendor)

vendor用来存放包的特殊依赖,发布项目直接把依赖包发布上去(公网管理则只上传依赖关系文件godeps文件)

资源文件等都放在src目录同级,编译文件放在bin,引用直接../引用。

govendor的用法

使用go很长时间后才整明白vendor的用法为啥这么坑人。

注意

这和当前工作路径相关:

gomodule和vendor是两个冲突的设计,二者只能选一,不可混用。

如果从vendor到module迁移的怎么办:

-mod=vendor

gomod使用

目前,golang的包管理工具有很多,用的比较多的包括:govendor、godep、glide等等。但是,一直以来,golang官方都没有提供一个标准的包管理工具,知道go1.11发布后,出现了一个实验中的gomodule。

a、全局启用

b、当前shell窗口启用

c、常用代理地址

3.1初始化

4.1查看所有依赖包

4.2查看包有哪些版本

4.3如何更换版本

4.4使用gomodedit直接修改

4.5删除未使用的依赖项

4.6查看所有命令

Go1.11版本支持临时环境变量GO111MODULE,通过该环境变量来控制依赖包的管理方式。当GO111MODULE的值为on时,那么就会使用modules功能,这种模式下,

当GO111MODULE的值为off时,不再使用modules功能。此时软件包的使用顺序为:

优先使用vendor目录下面的包,如果vendor下面没有搜索到,再搜索

要么完整使用vendor下面的包,要么完整使用$GOPATH下面的包,不会混合使用。

当使用gomodvendor指令,将依赖包全部拷贝至当前项目下后,当前项目就可以随意拷贝分发,避免因网络问题造成接收者安装依赖包的麻烦。

记一次gomodule的坑

事情是这样的,因为小马本次要写一个go项目。但是因为一些权限问题,一些依赖包在内网小马获取不到,于是只能求助大大。大大给的策略就是他先把所有的依赖包gomod,然后gomodvendor迁移到项目目录vendor下进行本地依赖载入即可,也就是使用gobuild-mod=vendor来编译即可。一切似乎看起来还是那么完美。然后正要起飞,直接翻车,现场如下。【这里插播一条发现,就是使用golangIDEgobuild和使用命令行gobuild的区别在于前者不会生成.exe文件】

将大大gomodvendor完的包pull到本地,只要编译就会发生如下错误(以下省略了一部分类似的报错)。其实是go.mod内的所有依赖包都报错。

大大说他的本地编译是正常的。不得不怀疑是不是因为大大本地gopath还有一份包依赖的原因,然而经查并不是这个问题。翻阅了网络上的大部分资料无果,网络上要么是说是因为识别不到包,按照提示重新go?mod?vendor一下就可以了。小马蛮试了一下,不出所料必然地报远程报获取不到呢,IDE的报错定位其实是不准确的。再次检查vendor/modules.txt文件,没有问题,无果。于是开始质疑golangIDE的版本支持问题,无果。看了下go.mod文件中写着go1.14,也没错呢,小马用的GOSDK正是1.14.4版本。敲出goenv查看环境配置,GO111MODULE=on,因为环境变量是auto,但是go到一定版本后默认是on,也没问题,无果。那问题出在哪呢?由于没有依赖包拉取权限,只能再次求助大大,大大表示也很奇怪,一番折腾,于是问题得到解决。【这里插播一条好玩的东西,就是GO111MODULE为什么是GO111呢,因为其实1.11版本开始支持MODULE的】

结论是:因为大大go?mod的时候用的是go1.13,而我编译的时候用的1.14,所以就报了这个奇怪的错误。youwhat?直接懵逼。但是为啥go.mod文件中写的版本要求是1.14,而大大用1.13也编译得好好的。

这是个大坑,掉进坑里自己扑腾了一天!!希望大家谨慎入坑。

爬坑一小时出坑一秒钟,每一次的爬坑都是充满着十八般绝技。奇怪的姿势又增加了。

go运行方式有哪几种?

如果GO111MODULE是auto则根据项目目录位置和是否含有go.mod文件来决定使用什么模式。如果是GO111MODULE=off则使用gopath,如果是on则使用module模式。gopath模式下的src目录下不能有go.mod文件,否则报错。

一些gomod命令记录备用,国内的资料并不多(注意gomod?命令在?$GOPATH?里默认是执行不了的,因为?GO111MODULE?的默认值是?auto。默认在$GOPATH?里是不会执行,如果一定要强制执行,就设置环境变量为?on。):

go语言import时为什么都从github导入

go/src/go-cve-dictionary-master

#mvsubcommands-master/opt/go/src/subcommands

#mvnet-master/opt/go/src/net

#mvgo-sqlite3-master/opt/go/src/go-sqlite3

都放到了go/src目录下了,我还修改了go-cve-dictionary-master/main.go文件内容,如下所示:

import(

"flag"

"fmt"

"os"

"golang.org/x/net/context"改为“context”

"github.com/google/subcommands"改为subcommands

"github.com/kotakanbe/go-cve-dictionary/commands"改为go-cve-dictionary/commands

"github.com/kotakanbe/go-cve-dictionary/version"改为go-cve-dictionary/version

_"github.com/mattn/go-sqlite3"改为go-sqlite3

)

执行#goinstallgo-cve-dictionary-master错误如下:

can'tloadpackage:/opt/go/src/go-cve-dictionary-master/main.go:14:2:non-standardimport"github.com/mattn/go-sqlite3"instandardpackage"go-cve-dictionary-master"

go-cve-dictionary-master/main.go:11:2:cannotfindpackage"go-cve-dictionary/commands"inanyof:

/opt/go/src/vendor/go-cve-dictionary/commands(vendortree)

/opt/go/src/go-cve-dictionary/commands(from$GOROOT)

/root/go/src/go-cve-dictionary/commands(from$GOPATH)

go-cve-dictionary-master/main.go:12:2:cannotfindpackage"go-cve-dictionary/version"inanyof:

/opt/go/src/vendor/go-cve-dictionary/version(vendortree)

/opt/go/src/go-cve-dictionary/version(from$GOROOT)

/root/go/src/go-cve-dictionary/version(from$GOPATH)

subcommands/subcommands.go:29:2:cannotfindpackage"golang.org/x/net/context"inanyof:

/opt/go/src/vendor/golang.org/x/net/context(vendortree)

/opt/go/src/golang.org/x/net/context(from$GOROOT)

/root/go/src/golang.org/x/net/context(from$GOPATH

热心网友 时间:2024-09-28 05:40

golang的GOPATH和vendor的搜索关系

golang的GOPATH和vendor的搜索关系

项目只有一个包,即main包,没有引用其他的包(golang自带的系统包除外)。

然后设置GOPATH=path/to/goproject,再运行gobuildmyproject,这样就可以在任何目录下面编译,编译生成的可执行文件就在编译所在的目录下,而不是包源文件所在的目录。

基本规则:

鉴于此,建议golang项目必须严格按照规范的目录结构组织,哪怕是前面这种自包含的项目。

基本规则:

如果一个包在vendor和GOPATH下面都存在那么谁会优先使用呢。

结论是:

包mydeps在vendor目录下面和GOPATH路径下面都存在了,那么main.go引用的时候只会引用vendor下面的mydeps(src/myproject/vendor/mydeps),而忽略GOPATH下面的mydeps包(src/mydeps)。

前面提到GOPATH和PATH类似,可以包含多个路径,中间用分号隔开,go在搜索包的时候会按手续从前往后搜搜。那么vendor怎么处理层级关系呢。

规则是:

举例:

如果src/mydep/mydep1/mydep.go引用了myvendor1和myvendor,那是怎么搜索的呢

Go语言有什么好用的IDE吗

我喜欢jetbrains系列的IDE+go插件。不过我要说的是这个问题主要看你的观点如何。

说eclipse:

构建方式是使用goinstall命令,每一次编译运行都是goinstall。这样的好处就是如果你有很多的包,下载下来并没有编译,这样每次编译速度是很快的。而且(!)goinstall符合go官方的项目结构,官方说过了,一个go的项目应该是以个gopath,包含src,pkg,bin三个主要目录。所以说goinstall个人认为才是主要的go编译方式。

说eclipse的缺点:

其实eclipse插件的go编译方式,还有目录结构,项目结构,都是非常完美的!!!!真的很完美!可是,他的代码提示,太差件!大括号都不能自动补全,gdb32bit64bit兼容问题,eclipseC++没有htmljs插件,需要手动安装,几乎不能开箱即用。不过如果你是开发算法,数据处理,还是推荐eclipse的,毕竟其他都无关紧要。

说jetbrains:

说先说clione肯定不适合,新建项目没有向导,导致改成go项目各种不开心,比如图标对于我来说就无法接受golib不是小耗子~这是次要的,重要的是各个文件都是灰色的(没有在cmake中包含的结果),然后说剩下的,phpstorm这个不说了,估计很少有人插件按在这里,webstorm,体验也不是很好,idea?体验很好,可是毕竟比较重,尤其是现在加入了自家的K啥玩意(无意冒犯,没记住单词)~可是话说回来,go跟C系列IDE配合才是最佳,跟java系列一点不搭关系,用idea似乎有点格格不入,但是!idea支持新建项目向导,lib的图标也很清晰,最后还是选择idea吧,期待clion的强大起来!

再说jetbrains系列缺点:

插件的构建方式是gobuiild这个让人很不爽,我们几乎不确定会构建到什么地方去,还要每次设置一下run配置。这个可能无关紧要,毕竟不是什么大的毛病,可是gobuild不能缓存.a文件,直接构建的结果就是很多第三方包的情况下很慢!所以建议安装包的时候手动install一下解决这个问题。自带代码格式化,这个格式化跟go格格不入,总的来说就是蛋疼,心碎,菊花痒。

最后说liteIDE:

轻量级IDE,我可以说是国人GO伟大作品典范,然而默认构建也是gobuild,项目管理方式不符合go官方标准。代码提示不能自动导入(eclipse也不能),不过如果你的项目是以包为单位的,那么另当别论。一定很不错,毕竟是轻量级专门针对GO的IDE!

说这些,其实还有很大一部分取决于你的项目是用vendor机制管理,还是godeps机制管理依赖关系。go不像java拥有强大的几乎天下一统的maven(无意冒犯,暂不评价其他构建套件)。

go没有官方包仓库。

go没有官方包管理工具。

go没有官方自动化构建套件。

上面三个没有是致命要害。导致民间各种百花齐放。

说说我的项目怎么管理

gpm一个shell工具(windows下你可以用git的bash,或者cygwin~)

我是严格艳照官方推荐方式管理go项目,一个go项目一个gopath。系统的gopath只是为了安装go命令,我没有配置gobin,意义不大。

项目的依赖跟我的代码包都在src下(非vendor)

vendor用来存放包的特殊依赖,发布项目直接把依赖包发布上去(公网管理则只上传依赖关系文件godeps文件)

资源文件等都放在src目录同级,编译文件放在bin,引用直接../引用。

govendor的用法

使用go很长时间后才整明白vendor的用法为啥这么坑人。

注意

这和当前工作路径相关:

gomodule和vendor是两个冲突的设计,二者只能选一,不可混用。

如果从vendor到module迁移的怎么办:

-mod=vendor

gomod使用

目前,golang的包管理工具有很多,用的比较多的包括:govendor、godep、glide等等。但是,一直以来,golang官方都没有提供一个标准的包管理工具,知道go1.11发布后,出现了一个实验中的gomodule。

a、全局启用

b、当前shell窗口启用

c、常用代理地址

3.1初始化

4.1查看所有依赖包

4.2查看包有哪些版本

4.3如何更换版本

4.4使用gomodedit直接修改

4.5删除未使用的依赖项

4.6查看所有命令

Go1.11版本支持临时环境变量GO111MODULE,通过该环境变量来控制依赖包的管理方式。当GO111MODULE的值为on时,那么就会使用modules功能,这种模式下,

当GO111MODULE的值为off时,不再使用modules功能。此时软件包的使用顺序为:

优先使用vendor目录下面的包,如果vendor下面没有搜索到,再搜索

要么完整使用vendor下面的包,要么完整使用$GOPATH下面的包,不会混合使用。

当使用gomodvendor指令,将依赖包全部拷贝至当前项目下后,当前项目就可以随意拷贝分发,避免因网络问题造成接收者安装依赖包的麻烦。

记一次gomodule的坑

事情是这样的,因为小马本次要写一个go项目。但是因为一些权限问题,一些依赖包在内网小马获取不到,于是只能求助大大。大大给的策略就是他先把所有的依赖包gomod,然后gomodvendor迁移到项目目录vendor下进行本地依赖载入即可,也就是使用gobuild-mod=vendor来编译即可。一切似乎看起来还是那么完美。然后正要起飞,直接翻车,现场如下。【这里插播一条发现,就是使用golangIDEgobuild和使用命令行gobuild的区别在于前者不会生成.exe文件】

将大大gomodvendor完的包pull到本地,只要编译就会发生如下错误(以下省略了一部分类似的报错)。其实是go.mod内的所有依赖包都报错。

大大说他的本地编译是正常的。不得不怀疑是不是因为大大本地gopath还有一份包依赖的原因,然而经查并不是这个问题。翻阅了网络上的大部分资料无果,网络上要么是说是因为识别不到包,按照提示重新go?mod?vendor一下就可以了。小马蛮试了一下,不出所料必然地报远程报获取不到呢,IDE的报错定位其实是不准确的。再次检查vendor/modules.txt文件,没有问题,无果。于是开始质疑golangIDE的版本支持问题,无果。看了下go.mod文件中写着go1.14,也没错呢,小马用的GOSDK正是1.14.4版本。敲出goenv查看环境配置,GO111MODULE=on,因为环境变量是auto,但是go到一定版本后默认是on,也没问题,无果。那问题出在哪呢?由于没有依赖包拉取权限,只能再次求助大大,大大表示也很奇怪,一番折腾,于是问题得到解决。【这里插播一条好玩的东西,就是GO111MODULE为什么是GO111呢,因为其实1.11版本开始支持MODULE的】

结论是:因为大大go?mod的时候用的是go1.13,而我编译的时候用的1.14,所以就报了这个奇怪的错误。youwhat?直接懵逼。但是为啥go.mod文件中写的版本要求是1.14,而大大用1.13也编译得好好的。

这是个大坑,掉进坑里自己扑腾了一天!!希望大家谨慎入坑。

爬坑一小时出坑一秒钟,每一次的爬坑都是充满着十八般绝技。奇怪的姿势又增加了。

go运行方式有哪几种?

如果GO111MODULE是auto则根据项目目录位置和是否含有go.mod文件来决定使用什么模式。如果是GO111MODULE=off则使用gopath,如果是on则使用module模式。gopath模式下的src目录下不能有go.mod文件,否则报错。

一些gomod命令记录备用,国内的资料并不多(注意gomod?命令在?$GOPATH?里默认是执行不了的,因为?GO111MODULE?的默认值是?auto。默认在$GOPATH?里是不会执行,如果一定要强制执行,就设置环境变量为?on。):

go语言import时为什么都从github导入

go/src/go-cve-dictionary-master

#mvsubcommands-master/opt/go/src/subcommands

#mvnet-master/opt/go/src/net

#mvgo-sqlite3-master/opt/go/src/go-sqlite3

都放到了go/src目录下了,我还修改了go-cve-dictionary-master/main.go文件内容,如下所示:

import(

"flag"

"fmt"

"os"

"golang.org/x/net/context"改为“context”

"github.com/google/subcommands"改为subcommands

"github.com/kotakanbe/go-cve-dictionary/commands"改为go-cve-dictionary/commands

"github.com/kotakanbe/go-cve-dictionary/version"改为go-cve-dictionary/version

_"github.com/mattn/go-sqlite3"改为go-sqlite3

)

执行#goinstallgo-cve-dictionary-master错误如下:

can'tloadpackage:/opt/go/src/go-cve-dictionary-master/main.go:14:2:non-standardimport"github.com/mattn/go-sqlite3"instandardpackage"go-cve-dictionary-master"

go-cve-dictionary-master/main.go:11:2:cannotfindpackage"go-cve-dictionary/commands"inanyof:

/opt/go/src/vendor/go-cve-dictionary/commands(vendortree)

/opt/go/src/go-cve-dictionary/commands(from$GOROOT)

/root/go/src/go-cve-dictionary/commands(from$GOPATH)

go-cve-dictionary-master/main.go:12:2:cannotfindpackage"go-cve-dictionary/version"inanyof:

/opt/go/src/vendor/go-cve-dictionary/version(vendortree)

/opt/go/src/go-cve-dictionary/version(from$GOROOT)

/root/go/src/go-cve-dictionary/version(from$GOPATH)

subcommands/subcommands.go:29:2:cannotfindpackage"golang.org/x/net/context"inanyof:

/opt/go/src/vendor/golang.org/x/net/context(vendortree)

/opt/go/src/golang.org/x/net/context(from$GOROOT)

/root/go/src/golang.org/x/net/context(from$GOPATH

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
大同四区和市区的区别 大同云冈属于哪里 大同市云冈区建成区范围都有哪些 it wasn't long before i found a job.---before是什么意思 It wasn't long before a man from It wasn't long before和It won't be long before有什么区别吗? it wasn't long before和it won't be long before有什么不同?_百度知 ... 微信怎么查和一个好友的红包记录 马龙巴黎奥运会夺冠了吗 明天是中国的情人节??? CLion 中的 MinGW 配置(及中文坑解决) 在建行办理300元/月的定投基金只投了两个月后就一直没存钱进去了,请问... 建行的基金定投有没有风险 建行的基金定投怎么样 建行什么是基金定投 护妍天使痘痘贴好用吗 我的电脑联想天逸80,一键恢复以后打开浏览器老是出现个对话框说无法打开... 幼犬一直叫是什么原因?如何解决? 小狗狗在外面一直叫为什么 小狗半夜一直叫是为什么? 浙江消费新闻网维权投诉平台 在html中,我用单词设置颜色的时候,什么时候加双引号,什么时候不加?还是... 使用JS拼接标签元素到Html 页面后,标签前后自动加上" " 是什么原因... innerHTML 如何保留数值里面双引号如 size="20" 图片里拼装HTML标签时为什么style的内容换成单引号 在被双引号扩起来... ...梦见爷爷去世了..就醒了, 接着睡觉就梦见妈妈也要去世了.! 有谁知道一首歌里面有个小女孩在说吃糖葫芦.歌名叫什么 给老师送祝福的话怎么说 椅子跟桌子的高度应该是相差多少 北师大版小学语文所有赞美梅花,以花喻人,表示自己有贞操的诗句。 (四)ADC与DMA传输【HAL】 人教版四年级下册语文有哪些课程 500二甲基硅油价格透明 脂肪乳注液有什么作用呢 微信分身可以用同一个手机号注册吗 韩国电影《女高怪谈》共多少集?分别叫什么名字? 孙女有继承爷爷遗产得权利?? 微信上怎么制作投票_教你怎么制作微信网络投票 五位数的水表他是四位数过后是小数点吗?要是是整数的话那洗衣机洗一 play市场是什么意思? googleplay是什么意思(什么是googleplay) 胆囊壁胆固醇结晶什么意思 商务英语就业前景有哪些?? 胆固醇结晶、慢性胆囊炎【胆固醇结晶、慢性胆囊炎】 汉语言文学和商务英语哪个就业前景比较广阔 胆囊壁胆固醇结晶是什么意思 商务英语专业就业前景和就业方向 毕业以后做什么 商务英语就业前景好不好 胆固醇胆囊壁结晶什么意思 胆囊胆固醇结晶是什么