作者:的士发个火 | 来源:互联网 | 2023-05-28 12:13
所以我有以下文件
/src/baseService.thrift
/baseTypes.thrift
/baseSecurity.thrift
我希望将所有这些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但是当我尝试构建时,它是不行的.
有了节俭,你不能做thrift gen:baz *.thrift
,你必须一次做一个文件.对于其他语言,我们只做一个:
for f in `find *.thrift`; do
thrift -o myGenDir --gen go $f"
done
(用每个lang替换相应的gen命令)
对于Python来说这很好,因为它根据文件名[即foo/bar/{filename} /ttypes.py]将每个gen文件放在它自己的dir中.对于Java,它会转储foo/bar /中的所有文件,但每个类名都是唯一的.对于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文件.
1> JensG..:
问题是,ttypes.go和(大概)constants.go被for循环中的最后一行所覆盖.
是的,这是真的.
有没有解决的办法?
最(跨语言)的便携式建议是不要这样做.代替:
将不同的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
它适用于其他语言 - 似乎是对Go的疏忽.
这可能是您的印象,但如果您对跨语言兼容性感兴趣,我建议您不要尝试.行为与其他语言相同.就像一个例子:我最近修复(或更好地:解决)Erlang测试的一个问题,我必须在这个问题上完全解决这个问题.