为了账号安全,请及时绑定邮箱和手机立即绑定

为 Go 生成多个 Thrift 文件的正确方法

为 Go 生成多个 Thrift 文件的正确方法

Go
斯蒂芬大帝 2021-09-10 17:09:43
所以我有以下文件/src/baseService.thrift    /baseTypes.thrift    /baseSecurity.thrift我希望将所有这些节俭定义创建到一个库中。因此,每个文件的顶部是:baseService.thrift==================namespace java foo.barnamespace cpp foo.barnamespace js foo.barnamespace go foo.barimport "baseTypes.thrift"baseTypes.thrift================namespace java foo.barnamespace cpp foo.barnamespace js foo.barnamespace go foo.barbaseSecurity.thrift===================namespace java foo.barnamespace cpp foo.barnamespace js foo.barnamespace go foo.barimport "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] 将每个 gen'd 文件放在它自己的目录中。对于 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 循环中最后一个 gen'd 覆盖。有没有解决的办法?它适用于其他语言 - 似乎是对 Go 的疏忽。我错过了什么。我们有很多 Thrift 文件,里面有很多东西——我宁愿不必将同一包级别的所有东西都合并到一个 Thrift 文件中。
查看完整描述

2 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

最近有同样的问题。不同命名空间中的每个 IDL 都不起作用。代码看起来很糟糕,你必须记住到处都有不同的命名空间,为每一件小事添加/删除命名空间很烦人。

我只定义了一个命名空间,所以我来了。基本上,对象位于不同的文件中,但它们是在单个文件中写入的。所以没有导入,没有跨文件引用,每个文件中没有命名空间。我将命名空间放在一个单独的文件中。然后我的脚本将所有内容合并到一个大的 thirft 文件中并进行编译。它确实要求您按正确的顺序排列所有内容,但它适用于我需要的语言 - Go、C# 和 Java 工作正常。

对我来说,这看起来也是一种疏忽。没有理由仅仅为了 Go 就这样。也许有一天我会发送一个行为更符合其他语言的合并请求。


查看完整回答
反对 回复 2021-09-10
  • 2 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信