【问题标题】:Fetching Go package dependencies using tags使用标签获取 Go 包依赖项
【发布时间】:2013-06-24 12:04:30
【问题描述】:

如何使用特定导入的版本标签一次获取 Go 包的所有依赖项?

假设我的 go 树中有多个包:

src/
    foo/
        bar/               (go code in package bar)
            x.go
        quux/              (go code in package main)
            y.go

现在让包 `bar' 依赖于使用标签版本的第三方库
(即通常通过以下方式获取:go get -tags mylib_2.0 github.com/user/mylib

我要做的是在导入行上指定一个标签 以便 go get ./... 在我的树上获得正确的版本方案。比如:

import "github.com/user/mylib" `tags=mylib_2.0`

【问题讨论】:

  • Re: “我想做的是在导入行上指定一个标签,以便 go get ./... 在我的树上获得正确的版本方案。”这通常是不可能的。而且它并不特定于 Go。
  • 那么我应该如何处理这种情况? (说它是一个自动构建系统)有什么解决方法吗?
  • 如果在一般情况下不可能,那么在一般情况下就没有办法处理它。考虑 a1->b1->d1 和 a1->c1->d2。哪个版本的 d 应该结帐?您不能在同一位置同时签出两个(或多个)不同版本的存储库。但该位置仅取决于导入路径,而不取决于任何版本。
  • 好吧 go get 在这种情况下可能会发出错误。如果你这样做,也会出现同样的问题:go get -tags mylib_2.0 github.com/user/mylib 并在其他地方使用 mylib 3.0 调用没有?

标签: dependencies go


【解决方案1】:

也改变你的项目结构:

src/
    foo/
        bar/
           v1/    (go code in package bar)
              x.go
           v2/
              x.go
        quux/ 
             v1/   (go code in package main)
                y.go

这是处理不同版本库的唯一可能方法。

这样你也解决了 jnml 描述的问题,现在每个库都有自己的依赖关系和其他库的版本。

因 cmets 更新:

根据此处描述的工作空间文档:
http://golang.org/doc/code.html#Workspaces

你的结构看起来像

src/
    foo/
        bar/
           v1/    (go code in package bar)
              x.go
           v2/
              x.go
        quux/ 
             v1/   (go code in package main)
                y.go
        meier/ 
             v1/   (go code in package main)
                w.go
             v2/   (go code in package main)
                w.go

现在在您的 bar lib (x.go) 中,您需要 lib *quux (y.go) 中的函数
要导入这个,你会写:

import "foo/quux/v1/"

就像注意你也可以在你的结构中做包之前的版本,所以你的结构可能看起来像 /foo/v1/quux 而不是 foo/quux/v1,那么你不需要 name进口。

现在 lib quux 在版本 1 中使用 lib meier
所以导入将是:

import "foo/meier/v1"

关于 jnml, 现在你的 lib bar 也需要 lib meier 但在版本 2
所以导入看起来像:

import "foo/meier/v2"

现在当你打电话时:bar -> quux -> meier
您将看到您无法将 bar 中的返回值分配/传递给来自 meier

的内容

因为:meier/v1 != meier/v2

这将在编译过程中失败。

如果您需要处理来自 meier v1quux 结果,您还需要在 中导入 meier/v1 >酒吧

【讨论】:

  • 它只解决/最多解决位置部分。它不能解决分配不兼容的类型 v1.T 和 v2.T(可在同一个包中传递)、init 函数运行两次、全局变量加倍等问题。
  • 是的,但是传递性地使用 lib/api 是你根本不应该做的事情,另一个是的,它们是两次,但这就是他想要的
  • 考虑 a1->b1->d1 和 a1->c1->d2。现在:package a; import ("b"; "c"); func main() { x, y := b.F(), c.F()} // x not assignable to ypackage b; import "d"; func F() d.T { return d.T{} }package c; import "d"; func G() d.T { return d.T{} }。在非平凡的程序中使用传递类型是不可避免的。
  • 我不明白项目结构会如何改变这个问题,你能详细说明一下吗?如果我有两个依赖于不同库版本的包(bar->mylib1 和 quux->mylib2)v1 和 v2 如何处理?您是否假设软件包版本之间的依赖关系相同(bar(v1)->mylib1 / quux(v1)->mylib1 和 bar(v2)->mylib2)?
  • 我扩展了答案,希望它更清楚我的意思,例如这也是谷歌使用的方式,这里是一个例子:code.google.com/p/google-api-go-client/source/browse/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多