如何为Ruby MRI贡献代码

147 阅读3分钟

我最近在做(到目前为止)我对Ruby MRI最大的补丁。虽然这个修改集只有50行代码,但我花了几天时间,花了几次时间来找出正确的方法,使getaddrinfo ,并在DNS不健康的时候快速失败。

当你准备为一些大型的C语言代码库做贡献时,往往不知道从哪里开始。这篇文章是一个笔记的集合,主要是为我自己,关于如何为Ruby贡献代码。

  • make 是你最好的朋友。对于任何项目,通常我喜欢从阅读Makefile开始,但是Ruby使用 来生成与平台相关的Makefile,所以1)在开始时你甚至没有Makefile 2)生成的Makefile不是太可读。不过,还是要学习和了解一下 和 的一般作用。autoconf make make install

  • 至少对我的补丁来说,我不得不在Linux上开发和运行它,因为它是针对操作系统的。我的主要电脑是Mac,通常的选择是运行devbox虚拟机,在那里写我的代码。我并不总是喜欢虚拟机,因为它需要额外的时间来配置,而且用它来使用你最喜欢的编辑器也比较麻烦(除非你有一个便携的VIM配置)。

    我最近在推特上说VS Code的devcontainers功能非常棒,我也想为MRI试试。我只用了一个docker compose up ,然后在VS Code中 "Attach to container",就可以继续在我的编辑器中写代码,同时能够在Linux上构建和测试。这让我在这个项目上的工作变得更加轻松。请看我使用的docker-compose.yml

    下面是一个正在运行的Ubuntu容器与编辑器集成的截图。

image.png

  • 在你做出改变之后,你通常会想运行测试。我知道如何为Rails (bin/rails test test/...)和Minitest (bundle exec ruby -Itest test/...)运行测试,但据我所知,每个C项目都是不同的,MRI有自己的测试框架。make test-allmake test-all TESTS='test/path/to/test' 是这里运行测试的方法(下面会有更多介绍)
  • Koichi的ruby hack challenge repo是一个关于 "我如何开发这个项目 "的宝库。它包含了关于MRI结构、如何构建它、如何测试它等等的多个指南。你可以忘记我的帖子是关于什么的,但是如果你有兴趣为MRI做贡献,那就是你应该去的repo
  • 下面是我使用的流程。
$ make # build within current directory
$ make install-nodoc # install built files skipping rdoc which takes time
./ruby my-script-to-reproduce.rb # run something on locally built ruby
$ make test-all # run all tests, thought that will take a while
$ make test-all TESTS='test/socket/test_socket.rb' # run socket-related tests

# push to github, let the CI generate more failed tests
# run tests locally again and try to fix it
  • 当涉及到对内部的黑客攻击和编写本地宝石时,Ruby C API是非常有价值的。

希望这对你有帮助。即使你没有要贡献的补丁,学习语言的实际工作方式,以及发现Ruby在C语言中的实际实现方式,仍然是非常有趣的。