По сути, я хочу знать, могу ли я, просто используя библиотеку C Ruby, добавить к $ LOAD_PATH.
Причина для этого заключается в том, что у меня есть написанное расширение (с использованием Rice, но это не супер важно), и я хотел бы, чтобы оно содержало себя вместе с несколькими другими в их собственном каталоге.
Теперь у меня уже есть два рабочих решения, с которыми я в порядке. Во-первых, я просто использую Makefile, сгенерированный Rice, для автоматической установки общего объекта в стандартный каталог, который уже находится в $ LOAD_PATH. Супер легко без хлопот. Другая причина в том, что я экспортирую $ RUBY_LIB в качестве каталога, который мне нужен, перед запуском, и среда выполнения Ruby воспринимает это как чемпион. Но я хочу знать, могу ли я сделать это только на C — для справки я ищу функциональность, которая имитирует ruby -I./somedir
Прямо сейчас я инициализирую Ruby в C следующим образом, это прекрасно работает с ранее упомянутыми рабочими решениями, но что я хочу, это способ аккуратно добавить каталог в $ LOAD_PATH Руби во время выполнения.
ruby_sysinit(&argc, &argv);
RUBY_INIT_STACK;
ruby_init();
ruby_init_loadpath();
....
rb_load_protect(...)
rb_funcall(...)
Я не мог понять, как работать с ruby_options
он просто дал мне узел, а затем заблокировал основной поток, поэтому я ничего не мог сделать; я использовал это неправильно?
Спасибо!
Чтобы получить доступ к загрузке $LOAD_PATH
переменная, используйте rb_gv_get("$LOAD_PATH")
в вашем коде.
rb_gv_get("$LOAD_PATH")
возвращает объект массива Ruby, поэтому можно использовать любую функцию массива C, такую как rb_ary_unshift
, rb_ary_push
, так далее.
Например:
VALUE load_path = rb_gv_get("$LOAD_PATH");
/* add a directory to Ruby's $LOAD_PATH */
rb_ary_push(load_path, rb_str_new2("any expanded directory"));
Других решений пока нет …