Как использовать вендорный аргумент для функции во внешнем пакете? - PullRequest
2 голосов
/ 14 марта 2019

У меня есть пакет 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 обеспечить».

В другом пакете у меня есть файл 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

EDIT: У меня есть полный контроль над пакетом А, так что я могу изменить способ, которым я продаю вещи там. Я также могу обновить свою версию Go, если есть простое исправление с помощью новой версии Go.

UPDATE: Я обновился до Go 1.12.1 и удалил существующий каталог vendor. Я запустил "go mod init" и "go mod vendor" для пакета a, но все равно получаю ту же ошибку при запуске main.go в пакете b.

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

Если я пытаюсь импортировать полученный пакет напрямую из пакета, я получаю:

use of vendored package not allowed

1 Ответ

0 голосов
/ 15 марта 2019

Если необходимо использовать проданную копию зависимостей, тогда флаг -mod=vendor должен быть передан go run

Например,

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

1 directory, 2 files

создание модуля с именем testing, потому что пакет a импортируется как testing / a в main

> 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

> 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
...