为 Go 生成多个 Thrift 文件的正确方法
Proper way to gen multiple Thrift files for Go
所以我有以下文件
/src/baseService.thrift
/baseTypes.thrift
/baseSecurity.thrift
我希望将所有这些节俭定义创建到一个库中。因此每个文件的顶部是:
baseService.thrift
==================
namespace java foo.bar
namespace cpp foo.bar
namespace js foo.bar
namespace go foo.bar
import "baseTypes.thrift"
baseTypes.thrift
================
namespace java foo.bar
namespace cpp foo.bar
namespace js foo.bar
namespace go foo.bar
baseSecurity.thrift
===================
namespace java foo.bar
namespace cpp foo.bar
namespace js foo.bar
namespace go foo.bar
import "baseTypes.thrift"
问题是,如何将所有这些创建到一个 lib 包中?它适用于 java/cpp/js 但当我尝试为 go 构建时,它是行不通的。
节俭,你不能做一个 thrift gen:baz *.thrift
,你必须一次一个地做文件。对于其他语言,我们只做一个:
for f in `find *.thrift`; do
thrift -o myGenDir --gen go $f"
done
(为每个语言替换适当的 gen 命令)
对于 Python 这很好,因为它根据文件名 [ 即 foo/bar/{filename}/ttypes.py] 将每个生成的文件放在它自己的目录中。对于 Java,它会转储 foo/bar/ 中的所有文件,但每个 class 名称都是唯一的。对于 cpp,它会将其全部转储到 gen 目录中,但每个 thrift 文件的名称都是唯一的 [so {filename.h}, {filename.cpp}]。然而,对于 Go,它将所有内容转储到 foo/bar 中,如下所示:
/foo/bar/constants.go
/foo/bar/service.go
/foo/bar/service-remote/
/foo/bar/baz/ [for anything that has a namespace of foo.bar.baz]
/foo/bar/ttypes.go
问题是,ttypes.go 和(大概)constants.go 被 for 循环中最后生成的内容覆盖。有没有解决的办法?它适用于其他语言——似乎是对 Go 的疏忽。我错过了什么。我们有很多 Thrift 文件,里面有很多东西——我宁愿不必将同一包级别的所有东西都合并到一个 thrift 文件中。
The problem is, the ttypes.go and (presumably) constants.go are getting overwritten by whatever is gen'd last in the for loop.
是的,没错。
Is there a way around this?
最(跨语言)可移植的建议是不要这样做。相反:
- 将不同的 IDL 文件放入不同的命名空间
- 将属于一个命名空间的所有内容都放入一个 IDL 文件中
Thrift 编译器为 Go 提供了一些编译器开关,至少可以部分帮助您(您可以通过在命令提示符下键入 thrift --help
来获得所有语言的所有可用选项)
go (Go):
package_prefix= Package prefix for generated files.
thrift_import= Override thrift package import path (default:git.apache.org/thrift.git/lib/go/thrift)
package= Package name (default: inferred from thrift file name)
这些选项的使用方式与
类似
thrift -gen go:package=mypack,package_prefix=myprefix
It works for the other languages - seems like it's an oversight for Go.
这可能是您的印象,但如果您对跨语言兼容性感兴趣,我建议您不要尝试。行为与其他语言相同。举个例子:我最近解决了(或者更好:解决了)一个问题with the Erlang tests,我不得不解决这个完全相同的问题。
最近遇到了同样的问题。不同名称空间中的每个 IDL 都不起作用。代码看起来很糟糕,你必须记住到处都有不同的命名空间,每件小事都让 add/remove 命名空间烦人。
我只定义了一个命名空间,所以我使用了这个。基本上,对象位于不同的文件中,但它们是在单个文件中编写的。所以没有导入,没有跨文件引用,每个文件都没有命名空间。我将名称空间放在一个单独的文件中。然后我的脚本将所有内容加入一个大的 thirft 文件并编译它。它确实要求您按正确的顺序放置所有内容,但它适用于我需要的语言 - Go、C# 和 Java 工作正常。
对我来说,这也像是一个疏忽。没有理由只对 Go 如此。也许有一天我会发送一个行为更符合其他语言的合并请求。
所以我有以下文件
/src/baseService.thrift
/baseTypes.thrift
/baseSecurity.thrift
我希望将所有这些节俭定义创建到一个库中。因此每个文件的顶部是:
baseService.thrift
==================
namespace java foo.bar
namespace cpp foo.bar
namespace js foo.bar
namespace go foo.bar
import "baseTypes.thrift"
baseTypes.thrift
================
namespace java foo.bar
namespace cpp foo.bar
namespace js foo.bar
namespace go foo.bar
baseSecurity.thrift
===================
namespace java foo.bar
namespace cpp foo.bar
namespace js foo.bar
namespace go foo.bar
import "baseTypes.thrift"
问题是,如何将所有这些创建到一个 lib 包中?它适用于 java/cpp/js 但当我尝试为 go 构建时,它是行不通的。
节俭,你不能做一个 thrift gen:baz *.thrift
,你必须一次一个地做文件。对于其他语言,我们只做一个:
for f in `find *.thrift`; do
thrift -o myGenDir --gen go $f"
done
(为每个语言替换适当的 gen 命令)
对于 Python 这很好,因为它根据文件名 [ 即 foo/bar/{filename}/ttypes.py] 将每个生成的文件放在它自己的目录中。对于 Java,它会转储 foo/bar/ 中的所有文件,但每个 class 名称都是唯一的。对于 cpp,它会将其全部转储到 gen 目录中,但每个 thrift 文件的名称都是唯一的 [so {filename.h}, {filename.cpp}]。然而,对于 Go,它将所有内容转储到 foo/bar 中,如下所示:
/foo/bar/constants.go
/foo/bar/service.go
/foo/bar/service-remote/
/foo/bar/baz/ [for anything that has a namespace of foo.bar.baz]
/foo/bar/ttypes.go
问题是,ttypes.go 和(大概)constants.go 被 for 循环中最后生成的内容覆盖。有没有解决的办法?它适用于其他语言——似乎是对 Go 的疏忽。我错过了什么。我们有很多 Thrift 文件,里面有很多东西——我宁愿不必将同一包级别的所有东西都合并到一个 thrift 文件中。
The problem is, the ttypes.go and (presumably) constants.go are getting overwritten by whatever is gen'd last in the for loop.
是的,没错。
Is there a way around this?
最(跨语言)可移植的建议是不要这样做。相反:
- 将不同的 IDL 文件放入不同的命名空间
- 将属于一个命名空间的所有内容都放入一个 IDL 文件中
Thrift 编译器为 Go 提供了一些编译器开关,至少可以部分帮助您(您可以通过在命令提示符下键入 thrift --help
来获得所有语言的所有可用选项)
go (Go):
package_prefix= Package prefix for generated files.
thrift_import= Override thrift package import path (default:git.apache.org/thrift.git/lib/go/thrift)
package= Package name (default: inferred from thrift file name)
这些选项的使用方式与
类似 thrift -gen go:package=mypack,package_prefix=myprefix
It works for the other languages - seems like it's an oversight for Go.
这可能是您的印象,但如果您对跨语言兼容性感兴趣,我建议您不要尝试。行为与其他语言相同。举个例子:我最近解决了(或者更好:解决了)一个问题with the Erlang tests,我不得不解决这个完全相同的问题。
最近遇到了同样的问题。不同名称空间中的每个 IDL 都不起作用。代码看起来很糟糕,你必须记住到处都有不同的命名空间,每件小事都让 add/remove 命名空间烦人。
我只定义了一个命名空间,所以我使用了这个。基本上,对象位于不同的文件中,但它们是在单个文件中编写的。所以没有导入,没有跨文件引用,每个文件都没有命名空间。我将名称空间放在一个单独的文件中。然后我的脚本将所有内容加入一个大的 thirft 文件并编译它。它确实要求您按正确的顺序放置所有内容,但它适用于我需要的语言 - Go、C# 和 Java 工作正常。
对我来说,这也像是一个疏忽。没有理由只对 Go 如此。也许有一天我会发送一个行为更符合其他语言的合并请求。