`go build -mod vendor` не может использовать поставленные пакеты

При развертывании моих сервисов Go в Google AppEngine (стандарт) я получаю сообщение об ошибке, описывающее, что версия модуля не найдена, при этом все компилируется нормально.

Модули находятся в частном экземпляре Github и извлечены на vendor/.

A go build -mod vendor -o /dev/null ./... работает в локальном облаке, локально и в Google Cloud Build. Тег с именем v1.1.0 существует на github.com/company/gosystem:

gosystem$ git tag
v0.0.1
v0.0.2
v0.0.3
v1.0.0
v1.1.0
Failed to build app: [go build -o /tmp/staging172777881/usr/local/bin/start .] with env [PATH=/go/bin:/usr/local/go/bin:/builder/google-cloud-sdk/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=f3f56ce621f0 HOME=/builder/home BUILDER_OUTPUT=/builder/outputs DEBIAN_FRONTEND=noninteractive GOROOT=/usr/local/go/ GOPATH=/go GO111MODULE=on GOCACHE=/tmp/cache019702820 GOPATH=/go] failed: err=exit status 1, out="
go: finding github.com/pquerna/otp v1.1.0
go: finding github.com/gin-gonic/gin v1.4.0
go: finding github.com/pkg/errors v0.8.1
go: finding github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be
go: finding github.com/gosimple/slug v1.5.0
go: finding github.com/boombuler/barcode v1.0.0
go: finding github.com/company/gosystem v1.1.0
go: finding github.com/oblq/i18n v0.0.0-20181031085821-98eec2978e00
go: finding github.com/go-pg/pg v8.0.4+incompatible
go: finding golang.org/x/text v0.3.2
go: finding github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
go: finding github.com/modern-go/reflect2 v1.0.1
go: finding github.com/golang/protobuf v1.3.1
go: finding github.com/stretchr/testify v1.3.0
go: finding github.com/ugorji/go/codec v0.0.0-20190204201341-e444a5086c43
go: finding github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3
go: finding github.com/mattn/go-isatty v0.0.7
go: github.com/company/[email protected]: unknown revision v1.1.0

grep -RI 'gosystem@' * ничего не сообщает.


person Niels    schedule 21.05.2019    source источник
comment
Простое посещение github.com/venclave/gosystem с помощью веб-браузера возвращает ошибку 404. Посещение github.com/venclave сообщает, что у организации нет общедоступных репозиториев. Поэтому неудивительно, что go не удается получить этот репозиторий: его не существует.   -  person kostix    schedule 21.05.2019
comment
Если у вас есть другие средства, позволяющие инструменту go достигать содержимого этого репозитория, рассмотрите возможность использования директива replace в go.mod файле, чтобы перенаправить операцию выборки на другой URL.   -  person kostix    schedule 21.05.2019
comment
Возможно, я забыл упомянуть, но у меня есть частный доступ к этим репозиториям. Модули проверены на vendor/. (так как сборка работает)   -  person Niels    schedule 21.05.2019
comment
ОК, тогда используйте торговлю с go mod.   -  person kostix    schedule 21.05.2019
comment
Как уже упоминалось, сборка go работает. Я использую go build -mod vendor -o /dev/null ./.... Я сделал go mod vendor.   -  person Niels    schedule 21.05.2019
comment
В документе говорится, что когда go build -mod=vendor работает, он игнорирует информацию о версиях в go.mod файле. В вашей настройке, похоже, это не так. Отсюда два момента: 1) можете ли вы убедиться, что ваш vendor каталог действительно содержит правильные пути импорта ?; 2) запустить go build без перенаправления его вывода и с -x, чтобы он рассказывал, что он делает, с большим количеством деталей? Мне также интересно, что первая строка вашей ошибки содержит go: finding github.com/pquerna/otp v1.1.0.   -  person kostix    schedule 21.05.2019
comment
Хех! Как ни странно, без -mod vendor go build запустит загрузку пакетов в $GOPATH/pkg/mod. Я удивлен, что сборка не будет работать, потому что каталог vendor/ должен содержать все из-за go build -mod vendor?   -  person Niels    schedule 21.05.2019
comment
Хм, судя по формулировке вашего комментария, я полагаю, вы могли неверно представить, как работает /vendor: при использовании go toolset в режиме модулей продавец фактически должен препятствовать любым попыткам загрузки чего-либо: продавец - это то, чтобы нести ваши данные вместе с вашим код (обычно с полными исходниками). Поэтому go build -mod=vendor нужно просто заглянуть в /vendor и использовать то, что там есть.   -  person kostix    schedule 21.05.2019
comment
Что меня поражает, так это то, что go build -mod vendor тогда не должен работать, или gcloud app deploy не находится в «режиме продажи».   -  person Niels    schedule 21.05.2019
comment
Может быть, если GO111MODULE=on отключит торговлю? Что произойдет, если вы установите auto? Формулировка здесь является спорной, поэтому я просто предполагаю. Кроме того, если у вас действительно есть ручная проверка всего необходимого материала в /vendor, вы можете просто попробовать GO111MODULE=off и использовать неукрашенный go build (без -mod=vendor). Обратите внимание, что в конечном итоге это может сломаться (где-то после 1,12).   -  person kostix    schedule 21.05.2019
comment
@kostix: то же самое с GO111MODULE=auto: это работает для go build, но не для gcloud app deploy ..   -  person Niels    schedule 21.05.2019
comment
Кстати, см. выпуск № 27227; разве это не то, что вы испытываете? Если да, не могли бы вы вмешаться и описать там свой вариант использования?   -  person kostix    schedule 23.05.2019
comment
Ах, похоже, ты уже это сделал, спасибо.   -  person kostix    schedule 23.05.2019


Ответы (2)


В конце концов, я смог выполнить эту работу, заставив перейти к использованию vendor, добавив это в go.mod:

replace github.com/company/gosystem => ./vendor/github.com/company/gosystem
person Niels    schedule 23.05.2019

Go использует https для получения версий / зависимостей. Даже если вы используете поставщика, Go все равно проверит версию. А поскольку github.com/venclave/gosystem является частным репо, git не может получить к нему доступ.

Для этого есть несколько обходных путей.

1 - Используйте ssh:

git config --global url.ssh://[email protected]/venclave.insteadOf https://github.com/venclave

2 - Используйте токен GitHub:

Создайте GITHUB_TOKEN здесь, https://github.com/settings/tokens.

export GITHUB_TOKEN=xxx
git config --global url."https://${GITHUB_TOKEN}:[email protected]/venclave".insteadOf "https://github.com/venclave"
person Alex Pliutau    schedule 21.05.2019
comment
Я получил по SSH с аутентификацией по ключу и убедился, что все находится в vendor/. Иначе сборка никогда не сработает. - person Niels; 21.05.2019
comment
@ Нильс, что ты имеешь в виду, говоря, что я получаю данные по SSH? Вы настроили его, используя мой 1-й пример? Если нет - модули go будут использовать https, а не ssh. - person Alex Pliutau; 21.05.2019
comment
@Niels, попробуйте использовать HTTPS, см. это. Хотя для импорта или получения поставщиков через ssh с помощью инструмента dep обычно требуется Уловка конфигурации git: см. ref 1 и 2. - person Sergey Narozhnyy; 21.05.2019
comment
Также может оказаться полезным этот . - person Sergey Narozhnyy; 21.05.2019
comment
Я немного запутался, почему этот шаг должен иметь значение? Поскольку у меня есть все, что мне нужно, уже загружено в vendor/ с помощью go mod vendor или go mod download? - person Niels; 22.05.2019