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

Fur*_*rge 1 namespaces thrift go

所以我有以下文件

/src/baseService.thrift
    /baseTypes.thrift
    /baseSecurity.thrift
Run Code Online (Sandbox Code Playgroud)

我希望将所有这些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"
Run Code Online (Sandbox Code Playgroud)

问题是,如何将所有这些创建到一个lib包中?它适用于java/cpp/js但是当我尝试构建时,它是不行的.

有了节俭,你不能做thrift gen:baz *.thrift,你必须一次做一个文件.对于其他语言,我们只做一个:

for f in `find *.thrift`; do
   thrift -o myGenDir --gen go $f"
done
Run Code Online (Sandbox Code Playgroud)

(用每个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
Run Code Online (Sandbox Code Playgroud)

问题是,ttypes.go和(大概)constants.go被for循环中的最后一行所覆盖.有没有解决的办法?它适用于其他语言 - 似乎是对Go的疏忽.我错过了什么 我们有很多Thrift文件,里面有很多东西 - 我宁愿不必将同一个包级别的所有内容组合成一个thrift文件.

Jen*_*nsG 6

问题是,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)
Run Code Online (Sandbox Code Playgroud)

这些选项的使用方式类似于

 thrift -gen go:package=mypack,package_prefix=myprefix
Run Code Online (Sandbox Code Playgroud)

它适用于其他语言 - 似乎是对Go的疏忽.

这可能是您的印象,但如果您对跨语言兼容性感兴趣,我建议您不要尝试.行为与其他语言相同.就像一个例子:我最近修复(或更好地:解决)Erlang测试的一个问题,我必须在这个问题上完全解决这个问题.