структура папок моего проекта выглядит следующим образом
/folder1
/feature1
feature1.go //package feature1
go.mod
/feature2
feature2.go //package feature2
go.mod
/web
app.yaml
cloudbuild.yaml
main.go //package main (starts app)
go.mod
это внутри моего /web/go.mod
module mypackage
require(
//3rd party packages
feature1 v0.0.0
feature2 v0.0.0
)
replace(
feature1 => ../folder1/feature1
feature2 => ../folder1/feature2
)
если я запускаю GO111MODULE=on go build
, это прекрасно скомпилируется, и я могу запустить свой проект.
однако, если я сделаю gcloud app deploy
я получаю следующие ошибки:
go: parsing ../folder1/feature1/go.mod: open /tmp/staging614917184/folder1/feature1/go.mod: no such file or directory
go: parsing ../folder1/feature2/go.mod: open /tmp/staging614917184/folder1/feature2/go.mod: no such file or directory
эти файлы определенно существуют в моем проекте (иначе локальная сборка go не сработала бы).
вот соответствующий фрагмент моего app.yaml
runtime: go111
env: standard
до того, как я перешел на использование go.mod, приложение нормально развернулось через gcloud cli.
однако мне нужно иметь возможность указать конкретную версию для некоторых пакетов, которые я использую, поэтому я хочу перейти на использование модулей go.
с указанным выше изменением, сборщик gcloud нормально работает на начальном этапе сборки, но затем завершается ошибкой на этапе развертывания приложения (развертывание приложения gcloud)
движок приложения не поддерживает относительные пути в go.mod? если да, то можно ли заставить эту структуру папок работать?
EDIT:
это оказалось ключом Как аутентифицировать частный модуль Go с помощью go 1.11 и Google App Engine Standard
, поскольку в движке приложения структура корневой папки не была загружена, исправление состоит в том, чтобы скопировать родительские папки в вашей подпапке, где находится ваш app.yaml. затем вы указываете на эту новую подпапку в вашем go.mod, используя синтаксис замены.