Go генерировать только сканы main.go
У меня возникли проблемы с использованием go generate для генерации сервера grpc при запуске go generate из корня каталога моего проекта.
Когда я бегу go generate -v
он только возвращается main.go
. Однако директивы определены в одном из подпакетов. Если я сбегуgo generate
в дополнительном пакете он работает должным образом. Я ожидал, что импорт обеспечитgo generate
найдет подпакеты и запустит директивы.
Структура проекта следующая:
cmd/
root.go
run.go
pkg/
subpkg/
protobuf/
proto1.proto
subpkg.go
main.go
Содержание subpkg.go
//go:generate protoc -I ./protobuf --go_out=plugins=grpc:./protobuf ./protobuf/proto1.proto
package subpkg
Содержание main.go:
package main
import (
"fmt"
"os"
"my-project/cmd"
)
func main() {
if err := cmd.RootCommand.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
В пакете run.go я импортирую пакет subpkg.
Как убедиться, что go generate можно запустить из корня проекта и выполнить все директивы во всех подпакетах.
1 ответ
Ты ищешь go generate ./...
.
За go help generate
:
usage: go generate [-run regexp] [-n] [-v] [-x] [build flags] [file.go... | packages]
...
For more about specifying packages, see 'go help packages'.
go help packages
:
Many commands apply to a set of packages:
go action [packages]
Usually, [packages] is a list of import paths.
An import path that is a rooted path or that begins with
a . or .. element is interpreted as a file system path and
denotes the package in that directory.
Otherwise, the import path P denotes the package found in
the directory DIR/src/P for some DIR listed in the GOPATH
environment variable (For more details see: 'go help gopath').
If no import paths are given, the action applies to the
package in the current directory.
...
An import path is a pattern if it includes one or more "..." wildcards,
each of which can match any string, including the empty string and
strings containing slashes. Such a pattern expands to all package
directories found in the GOPATH trees with names matching the
patterns.
Итак, если вы не указываете пакет для команды Go, которая его принимает, предполагается, что пакет является текущим каталогом. Подкаталоги - это разные пакеты, поэтому они не включены. Удобное сокращение для "этого пакета и всех пакетов в подчиненных каталогах рекурсивно":./...
, как в
go get ./...
go generate ./...
go test ./...