当前位置: 首页 > 面试题库 >

我应该如何在Go 1.6中使用供应商?

宇文俊明
2023-03-14
问题内容

我的gopath是GOPATH="/Users/thinkerou/xyz/",跟随如下:

thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ pwd
/Users/baidu/xyz/src/ou
thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ ls
main.go vendor

现在,我使用go get,然后变为:

thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ ls
main.go vendor
thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ cd vendor/
thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou/vendor$ ls
vendor.json
thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou/vendor$ cd ../..
thinkerou@MacBook-Pro-thinkerou:~/xyz/src$ ls
github.com ou
thinkerou@MacBook-Pro-thinkerou:~/xyz/src$ cd github.com/
thinkerou@MacBook-Pro-thinkerou:~/xyz/src/github.com$ ls
zenazn

vendor.json 这是:

{
    "comment": "",
    "package": [
        {
            "path": "github.com/zenazn/goji"
        }
    ]
}

那么,我应该使用什么命令?为什么没用vendor?我的go版本是1.6.2。


问题答案:

借助Go1.6,您可以在阅读时内置供应商。这是什么意思?只有一件事要牢记:

当使用go诸如go build或的工具时go run,他们首先检查依赖项是否位于中./vendor/。如果是这样,请使用它。如果不是,请还原到该$GOPATH/src/目录。

Go 1.6中的实际“查找路径”依次为:

./vendor/github.com/zenazn/goji
$GOPATH/src/github.com/zenazn/goji
$GOROOT/src/github.com/zenazn/goji

话虽如此,go get将继续安装到您中$GOPATH/src;并且,go install将安装$GOPATH/bin为二进制文件或$GOPATH/pkg程序包缓存。

呵呵,有了以上知识,这很简单:

mkdir -p $GOPATH/src/ou/vendor/github.com/zenazn/goji
cp -r $GOPATH/src/github.com/zenazn/goji/ $GOPATH/src/ou/vendor/github.com/zenazn/goji

简而言之,要使用github.com/zenazn/goji供应商,您需要使用相同的完整路径将文件复制到供应商主管中。

现在,go build / install / run工具将看到并使用您的供应商文件夹。

无需手动复制所有内容的简便方法

与其查找并复制所有25个以上的供应商项目,管理其版本,更新其他项目等,不如使用 依赖管理工具 。那里有很多,有些谷歌搜索会指向您几个。

让我说说两个可以与vendor文件夹一起使用并且不会打败您的文件夹:

  • Godep
  • Govendor

简而言之,这些工具将检查您的ou代码,找到远程依赖项,并将其 您的目录复制$GOPATH/src
您的$GOPATH/src/ou/vendor目录(实际上,运行它们时所在的当前目录)。

例如,假设您已经$GOPATH/src/ou/使用正常的依赖项GOPATH / src /
github安装了所有依赖项,并在项目中正常工作。您的项目将运行,并且您的测试将验证一切都与您所拥有的回购协议的确切版本一起使用。以Godep为例,您可以从项目的根文件夹运行此文件$GOPATH/src/ou/

godep save ./...

这会将项目使用的所有依赖项复制到./vendor文件夹中。

Godep是迄今为止最受欢迎的。他们在Gopher Slack组中拥有自己的Slack频道。而且,这是我在团队中使用的一种。

Govendor是我阅读的另一种选择,具有不错的同步功能。我还没有用过。

过度使用依赖管理工具

这纯粹是观点,我敢肯定仇恨者会拒绝投票。但是,由于我需要完成有关该主题的博客文章,因此在这里我要提一提,大多数人过分担心Go中的依赖管理。

是的,有必要将存储库锁定到您所依赖的版本,以确保系统可以在生产环境中构建。是的,有必要确保对依赖项进行中断的方式不做任何重大更改。

绝对要使用依赖管理。

但是,实际上,简单项目的使用过多,它们会锁定大量依赖项…

您可能只需要锁定1个依赖项;否则,您需要最新版本的MySQL驱动程序和测试声明框架以进行错误修复。

在这里,./vendor/除了依赖项管理工具之外,使用文件夹确实可以发挥作用:您只需要复制需要锁定的存储库即可。

您可以有选择地选择一个行为不当的存储库,并将其放入./vendor/文件夹中。这样,您就告诉消费者:

嘿,这个版本需要推迟。其他所有的都很好,并且使用最新的并经常更新go get -u ./...;
但是,此版本使用较新的版本失败,因此请不要升级此版本库。

但是,如果使用依赖项管理工具全面保存所有依赖项,则基本上是在告诉用户:

供应商文件夹中20个中的一个或多个存储库可能有问题,也可能没有问题。您可能会或可能无法更新它们。您可能无法获得最新的MySQL驱动程序。我们根本不知道哪些可能会或可能不会导致问题,只是锁定了我运行时起作用的东西godepsave。是的,升级风险自负。

就个人而言,我已经遇到过几次。依赖项已进行了重大更改,并且有数十个依赖项。在/ vendor中只提供一个仓库,就可以使我们使用该版本的依赖关系,而goget./...对于所有其他仓库,它可以继续正常运行以获取最新版本。我们使用PSQL和MySQL及其他版本中的最新错误修复程序(这些程序有持续的修复程序!)等等来运行。



 类似资料:
  • 问题内容: 我不太清楚当我这样说时会做什么: 我可以稍微了解使用它的原因,因为它不浏览整个数据库表以更新字段,而是仅更新新添加的记录。如我错了请纠正我。 所以我想做的是使用这样创建索引: 一旦执行此操作,文档就根本不会上传到索引。我要去哪里错了? 任何帮助,不胜感激。 问题答案: 如果您的表中有一个时间戳列(例如),则最好使用它代替ID号。这样,当记录更新时,您也可以修改该时间戳,输入插件将提取记

  • 问题内容: 在Objective- C中,我调用该方法来记录异常。如何在Swift中调用它? 问题答案: 使用Swift 2,您可以将Swift函数和闭包作为C函数指针传递 原始答案 从Xcode 6 beta 6开始,您不能这样做。 Swift确实支持传递函数指针,但是它们几乎就像不透明指针一样被对待。您既不能定义指向Swift函数的C函数指针,也不能在Swift中调用C函数指针。 这意味着您从

  • 问题内容: 这个问题在很多地方都被问到,变化不尽。例如Java-getClassLoader()。getResource()不仅使我烦恼不已。)我仍然无法使其正常工作。 这是一个代码片段: 此作品-请注意,我硬编码的路径,包含剪辑文件,该文件的目录 是 有,而且 是 在同一目录作为我的.class文件。las,注释掉的代码仅返回url的空值。 其他大多数帖子似乎都涉及getResourceAsSt

  • 问题内容: 我使用RedisConnection Set方法设置字节数组,但是如何获取数据?get返回包装的字节数组吗? 链接: http://code.google.com/p/booksleeve/ http://code.google.com/p/protobuf-net/ 这可行,但感觉不对: 更多信息: 问题答案: 那是完全正确的。“ Get”(BookSleeve)返回一个deferr

  • 我有一个包含一个活动和两个片段的应用程序,在第一个片段中,我应该能够将数据插入数据库,在第二个片段中,我应该能够在一个RecyclerView中看到添加的项目。 所以我已经创建了数据库、我的RecyclerView适配器和ViewModel, 我是否应该在活动中初始化ViewModel,并以某种方式从片段中调用它来使用insert? 我是否应该在两个片段中初始化viewmodel两次? 我的代码如

  • 问题内容: 这是我从这里看到的代码。我对关键字感到困惑。 对于,我需要? 对于,我需要? 问题答案: 无需在回调中使用return语句。Promise构造函数不期望回调返回任何类型的返回值。 因此,在该回调中使用语句的原因仅是为了控制该函数中的执行流程。 如果您希望回调内部的执行完成而又不执行该回调中的任何其他代码,则可以在此时发出a 。 例如,您可以这样编写代码,而无需声明: 在这种情况下,您使