如何在外部包中的函数中使用供应商参数?

时间:2019-03-14 20:50:33

标签: go go-modules

我有一个软件包a,它依赖于一个外部软件包语言软件包:

package a

import (
    "fmt"

    "golang.org/x/text/language"
)

// Machine is a printer
type Machine struct{}

// Printer prints
type Printer interface {
    Print(lang language.Tag)
}

// Print prints the language
func (p *Machine) Print(l language.Tag) {
    fmt.Println(l.String())
}

对于软件包a,我先运行“ dep init”,然后运行“ dep sure”。

在另一个软件包中,我有一个main.go文件,该文件会导入软件包a:

package main

import (
    "testing/a"

    "golang.org/x/text/language"
)

func main() {
    m := a.Machine{}
    m.Print(language.MustParse("en"))
}

我得到一个错误:

cannot use "golang.org/x/text/language".MustParse("en") (type "golang.org/x/text/language".Tag) as type "testing/a/vendor/golang.org/x/text/language".Tag in argument to m.Print

如果我将主包装放入包装a中,则可以正常工作。为什么从外部程序包中调用时不起作用?

Go版本为1.10.2

编辑: 我对软件包a拥有完全控制权,因此我可以更改在其中提供东西的方式。如果使用新的Go版本可以轻松解决问题,我也可以升级Go版本。

更新: 我已经升级到Go 1.12.1,并删除了现有的供应商目录。我为程序包a运行了“ go mod init”和“ go mod vendor”,但在程序包b中运行main.go时仍然遇到相同的错误。

cannot use "testing/b/vendor/golang.org/x/text/language".MustParse("en") (type "testing/b/vendor/golang.org/x/text/language".Tag) as type "testing/a/vendor/golang.org/x/text/language".Tag in argument to m.Print

如果我尝试直接从a包导入供应商的包,我将得到:

use of vendored package not allowed

1 个答案:

答案 0 :(得分:-1)

如果要求使用依赖项的供应商副本,则将标志-mod=vendor传递给go run

例如,

> tree
.
|-- a
|   `-- machine.go
`-- main.go

1 directory, 2 files
  

创建名称为test的模块,因为程序包a被导入为main中的testing / a

> go mod init testing
go: creating new go.mod: module testing
> go mod vendor #this creates a vendor directory inside the project
go: finding golang.org/x/text/language latest
> tree -L 4
.
|-- a
|   `-- machine.go
|-- go.mod
|-- go.sum
|-- main.go
`-- vendor
    |-- golang.org
    |   `-- x
    |       `-- text
    `-- modules.txt

5 directories, 5 files  
> cat go.mod
module testing

go 1.12

require golang.org/x/text v0.3.0
> go run -mod=vendor main.go
en

上一个答案

下面是我的目录结构:

>tree /F
sample
│---go.mod
│---go.sum
│---main.go
│
└───a
    |---machine.go

转到版本

> go version
go version go1.12 windows/amd64

模块创建

  

使用名称testing创建模块,因为软件包a是   导入为testing/a在主要

> go mod init testing
go: creating new go.mod: module testing

程序执行

> go run main.go
go: finding golang.org/x/text/language latest
en