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

所以我有以下文件


/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] 将每个 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 文件中。


斯蒂芬大帝
浏览 187回答 2
2回答

拉莫斯之舞

最近有同样的问题。不同命名空间中的每个 IDL 都不起作用。代码看起来很糟糕,你必须记住到处都有不同的命名空间,为每一件小事添加/删除命名空间很烦人。我只定义了一个命名空间,所以我来了。基本上,对象位于不同的文件中,但它们是在单个文件中写入的。所以没有导入,没有跨文件引用,每个文件中没有命名空间。我将命名空间放在一个单独的文件中。然后我的脚本将所有内容合并到一个大的 thirft 文件中并进行编译。它确实要求您按正确的顺序排列所有内容,但它适用于我需要的语言 - Go、C# 和 Java 工作正常。对我来说,这看起来也是一种疏忽。没有理由仅仅为了 Go 就这样。也许有一天我会发送一个行为更符合其他语言的合并请求。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go