除非我使用完整路径,否则无法在 Ruby C 扩展中使用 Gems

标签 c ruby api rubygems

每当我尝试使用 Ruby 的 C API(带有 rb_require)来使用 gem 时,我都会收到“无法加载此类文件 --”错误,除非我使用完整路径。需要 gem 在常规 ruby​​ 脚本中工作得很好。这些是我还需要做的吗?这些 gem 是使用 Bundler 安装的。

最佳答案

当您从扩展调用 rb_require 时,您正在调用 Ruby 中请求文件的核心“内置”进程。这会绕过 Rubygems 在替换 Kernel#require 方法时添加的 Gem 处理代码。

为了获得正确的 gem 处理,您需要调用普通的 require 方法,并让常用的方法调度将调用路由到 Rubygems 代码。您可以通过以下方式做到这一点:

rb_funcall(rb_cObject, rb_intern("require"), 1, rb_str_new_cstr("the_gem"));

如果需要,您可以调用 rb_intern 一次并存储结果,以避免多次调用。

关于除非我使用完整路径,否则无法在 Ruby C 扩展中使用 Gems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45256926/

相关文章:

c - fwrite() 返回值与文件大小不匹配

c - 从中缀到后缀

ruby - 我在哪里可以获得 Centos OS 的 Ruby 1.8.6

api - 如何使 php api 调用 CloudFlare 以通过 URL 从缓存中清除单个文件

c++ - 正则表达式查找 mp3 html 文件

c - C 中的多维数组加载

ruby - 中间人检查页面是否存在

ruby - 选择排序困惑

c# - 找不到类型或命名空间 'frombody'

javascript - 如何检查谷歌日历API请求是否已完成?