Ruby 想请教一下关于 gem 源码的问题

2072190662 · 2022年04月04日 · 最后由 zhengpd 回复于 2022年04月04日 · 323 次阅读

最近在跟老师做一个项目,目的应该是要模仿连接 postgres 的 gem 包 pg 来为华为的数据库写一个连接 gem 包 老师给了我源码地址https://github.com/ged/ruby-pg,让我去读一读源码,要知道那一部分是干嘛的,但是我看里面的各种代码很乱,完全不知道有什么联系 各位可以给一点建议吗,如何去学习这个东西,还需要哪些知识 哦对了,我现在还是大二,最近也才刚接触 ruby 谢谢各位了

确定是模仿这个 gem 再“写”一个 gem 包?而不是“用”这个 gem 包写个工具😅 ??

要真是前者,我很想知道你老师对工作难度的评估是怎样的。即使对工作几年的人来讲,重写一个偏底层 gem 也够喝一壶的了。对一个大二刚学 ruby 没多久的人,这个需求实在是强人所难

ruby-pg 的核心在 c 语言扩展里(ext 目录),模仿它写一个 gem 确实是很有难度。所以同一楼疑问,确定老师不是让你用 ruby-pg 写个工具连接到华为的数据库吗?🤨

spike76 回复

因为华为的数据库是基于 postgres 进行改编的,但是使用 pg 这个 gem 包对华为数据库进行连接是会出问题的,按照我的理解应该是模仿 postgres 的包写一个 gem 包来进行连接,以便于对华为的 openguass 数据库进行兼容,按照老师的说法是到时候的工作大部分可以参考 pg 这个 gem 包的源码。 因为如果不是再写一个 gem 包的话好像没必要去读源码?应该是只要知道怎么使用就好了

zhengpd 回复

我只知道 ruby-pg 能够连接数据库,还不知道怎么使用它来写一个新的工具? 因为老师让我去读源码,我就感觉应该是要自己写一个,不然应该只要知道里面的方法怎么使用就好了,应该不用去读源码的。 至于难度,已经有心理准备了,因为之前的学长做的就是这个数据库的内核优化,函数兼容,也是比较难的

2072190662 回复
  1. 找你学长,或者看 opengauss 的文档,看哪些接口被修改了,就直接在 Gem 源码里找这些函数去修改。

  2. 另外,直接找你老师要现成的用 pg 跑不通的例子,debug 到里面看哪里有问题。先进 Ruby 部分,然后进 C 部分。

楼主加油,希望研究出来后,反馈给社区,教一下大家怎么实现的 😁

如果你初学的话,或许可以这样: 先尝试着自己写一个简单的 gem,Google "ruby create gem" ,这样你可以理解 ruby-pg 源码的结构。 再尝试着去了解 ruby 如何与 C 交互,Google "ruby C extension" ,这样对 ext 文件夹里的内容,你也会有初步了解。

根据你描述的情况,我建议从结果导向,研究 pg 这个 gem 连华为数据库为什么报错?或者 华为数据库修改了什么?然后再回去翻源码,如果是小 bug 的话,或许简单调整下就可以解决问题。

你需要看这个文档了解 gem 的目录结构 https://guides.rubygems.org/

特别是 https://guides.rubygems.org/gems-with-extensions/ 关于怎么调用 C 的库

搞懂 gem 的结构后看 ruby-pg 是怎么做的,然后看华为 db 跟 postgres 有什么不同,它们有没有提供 C 库,有的话用华为的 C 库替换 ruby-pg 的 C 库部分。

如果华为 db 是基于 postgres 开发的话,应该可以基于 ruby-pg fork 一份来修改。

按 fork 的思路可以是:

  1. fork ruby-pg
  2. 尝试用 ruby-pg 连接 openguass,不出意外的话,会报错,研究和修复出现的错误,然后重复尝试
  3. 假如连接成功了,再根据具体的功能需求,去 ruby-pg 找对应部分的源码研究

源码研究可以用 xmind 做思维导图,梳理文件结构和代码逻辑

gem 结构和 c ext 楼上都有回复了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号