首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于Go的生成多个Th深层文件的正确方法

用于Go的生成多个Th深层文件的正确方法
EN

Stack Overflow用户
提问于 2015-01-05 20:05:14
回答 2查看 3.8K关注 0票数 4

所以我有以下文件

代码语言:javascript
复制
/src/baseService.thrift
    /baseTypes.thrift
    /baseSecurity.thrift

我希望将所有这些节俭定义创建到一个库中。因此,每个文件的顶部如下:

代码语言:javascript
复制
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很好,但当我尝试构建for go时,这是不可以的。

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

代码语言:javascript
复制
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 dir中,但在每个节省文件中唯一命名为{filename.h},{filename.cpp}。但是,它将所有内容都放入foo/bar中,如下所示:

代码语言:javascript
复制
/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覆盖。有办法绕道吗?它适用于其他语言--似乎是对Go的疏忽。我错过了什么。我们已经有了很多包含大量内容的Thrift文件--我不希望将处于同一包级别的所有内容合并到一个节约文件中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-05 21:24:27

问题是,ttypes.go和(想必) constants.go正在被for循环中的任何gen覆盖。

是的,那是真的。

有办法绕道吗?

最(跨语言)可移植的建议是不要这样做。相反:

  • 将不同的IDL文件放入不同的命名空间
  • 将属于一个名称空间的所有内容都放入一个IDL文件中。

thrift --help编译器为Go提供了一些编译器开关,这些开关至少可以部分地帮助您(通过在命令提示符上键入获得所有语言的所有可用选项)

代码语言:javascript
复制
 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)

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

代码语言:javascript
复制
 thrift -gen go:package=mypack,package_prefix=myprefix

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

这可能是你的印象,但我建议不要尝试,如果你对跨语言兼容性感兴趣的话。其他语言的行为也是一样的。举个例子:我最近修复了一个问题with the Erlang tests (或者更好地解决了这个问题),在这个问题上,我不得不和这个问题做斗争。

票数 9
EN

Stack Overflow用户

发布于 2016-03-02 01:57:10

最近也有同样的问题。不同名称空间中的每个IDL都不能工作。代码看起来很糟糕,到处都有不同的名称空间需要记住,为每件小事添加/删除名称空间都很烦人。

我只定义了一个名称空间,所以我附带了以下内容。基本上,对象在不同的文件中,但它们是在单个文件中编写的。所以没有导入,没有跨文件引用,也没有每个文件中的命名空间。我把名称空间放在一个单独的文件中。然后,我的脚本将所有内容连接到一个大的第三英尺文件中,并编译它。它确实要求您将所有事情按正确的顺序排列,但它适用于我需要的语言- Go、C#和Java工作得很好。

对我来说也是个疏忽。没有理由就这么走了。也许有一天,我会发送一个合并请求的行为,更好地匹配其他语言。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27787009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档