gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:51:25 26 4
gpt4 key购买 nike

所以我有以下文件

/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,您不能执行 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/中的所有文件,但每个类名都是唯一的。对于 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 ,在那里我不得不解决完全相同的问题。

关于go - 为 Go 生成多个 Thrift 文件的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27787009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com