我正在尝试在 Go 中创建一个基于微服务的 API,非常基础,只是为了学习一些东西。我必须实现三个主要目标。
- 单回购。
- 能够根据需要使用不同的后端语言(即,Go 中的一种微服务,Node.js 中的两种,Python 中的一种)。
- 使用 gRPC。
目前我的结构看起来像这样(并且存储在~/Projects/tkg
GOPATH 之外)。
每个“服务”都应该是一个独立的应用程序,用“whatever”编写。如您所见,我有一个 Go 服务和一个 React 前端应用程序。此外,还有一个我想用来构建东西的 Makefile,但我可能会转向 shell 脚本、Docker 等等。没关系。
所以现在的问题。如何使生成的 proto 文件在此设置中正常运行?我想我对 Go 模块和包不太了解,因为我无法设置它以便articles.go
(从cmd
)可以访问生成的api/article.pb.go
. 怎么做?
// services/articles/go.mod
module tkg/services/articles
go 1.12
require (
github.com/golang/protobuf v1.3.2
google.golang.org/grpc v1.22.1
)
// services/articles/cmd/article.go
package main
import (
pb "tkg/services/articles/api/article"
)
type repository interface {
Create(*pb.Article) (*pb.Article, error)
}
func main() {
}
// services/articles/api/article.proto
syntax = "proto3";
package article;
option go_package = "tkg/services/articles/api/article";
...
// Makefile
build:
protoc services/articles/api/article.proto --go_out=.
我在 go.mod 中尝试了各种不同的包名称,在 proto 文件中尝试了不同的 go_packages,我尝试了不同的 protoc 命令和路径。我敢打赌这是愚蠢的,这对于精通 Go 的人来说是非常明显的,但对于像我这样来自 Node.js 背景的人来说,无能为力import "../api/article.pb.go"
是令人愤怒的。:(
我得到的错误是:could not import tkg/services/articles/api/article (no parsed files for package tkg/services/articles/api/article)
。当然,包名称的值不同。我已经尝试解决它两天了。
你会如何处理这个问题?