如何使用Git在开发和生产环境中分发Thrift生成的代码?
你是怎么在自己的代码库和部署流程中管理生成的源代码文件的,特别是用Git(比如PHP、Python等)?
举个例子,我有一个叫“interfaces”的代码库,里面有Thrift定义。这些定义可以转换成Python、PHP、JS等语言的骨架或存根。其他不同语言的项目,每个项目都有自己的代码库,都想使用这些存根。那我该怎么把这些存根交付给这些项目呢?
我只想到两种方法:
生成存根文件并把它们存放在“interfaces”这个代码库里,然后把这个代码库以只读的方式附加到其他项目中(比如作为子模块)。但是这样做会带来很多麻烦,因为在更新接口和存根的时候,涉及到的“git子模块”概念比较复杂,让人头疼。
把纯粹的“interfaces”代码库附加到每个项目中,然后把存根文件作为临时的、可以忽略的文件生成(比如用“make stubs”之类的命令)。这样,每个项目都可以有自己的生成设置,并可以根据需要应用自己的补丁。但这样的话,你需要在PHP/Python的开发和生产环境中引入一些编译命令(而不仅仅是“git pull”)。
这两种方法各有什么优缺点呢?
2 个回答
我觉得第二种方法是最好的,至少因为你不想让git自动合并那些生成的文件。
在你的php或python应用的初始化代码中,你可以检查一下idl文件和生成的代码文件的时间戳,如果发现有问题,就发出警告或者停止程序,或者如果有的话,就启动thrift编译器。
一般来说,选择“生成内容”的方式比“存储生成的内容”更好,主要是因为你不能百分之百确定这些生成的内容现在的状态:它们和源数据是否一致?
在你进行 push
操作时,可以使用一个叫做 post-receive hook 的工具来处理生成相关内容的工作。
你可以查看 Git Hooks 或者 Pro-Git hooks 来了解更多。
不过在你自己本地的环境中(也就是在执行 git pull
时),你可以设置一个别名,把拉取和生成内容的操作结合起来。