На всякий случай, если кто-то еще борется с этим, этот подход, который я выбрал, кажется, работает для меня.
Структура каталогов выглядит следующим образом:
/GOPATH
├──/appengine
| ├──/.git/
| ├──/project1
| | ├── app.yaml
| | └── app.go
| └──/project2
| ├── app.yaml
| └── app.go
└──/src
├──/project1
| ├──/.git/
| ├──/mutations/
| ├──/queries/
| ├──/types/
| ├──/vendor/
| └──/main.go
└──/project2
├──/.git/
├──/foo/
├──/bar/
├──/vendor/
└──/main.go
Каждый файл app.go в папке appengine содержит:
package projectX
import "projectX"
func init() {
projectX.Run()
}
Каждый main.go файл ниже src / projectX содержит:
package projectX
import (
// Import whatever you need
"google.golang.org/appengine"
)
func Run() {
// Do whatever you need
appengine.Main()
}
Кажется, что наличие папки, содержащей app.yaml вне $ GOPATH / src, действительно необходимо.
Это также не идеально для управления версиями, если вам нужно, чтобы каждый проект имел версию под своим собственным git-репо, в отличие от одного монолитного репо. Я решил это путем создания версий каждого проекта и управления версиями папки appengine, а также отдельно.