Почему операторы require требуют сбоя при загрузке (железного) скрипта ruby ​​через программу на C #? - PullRequest
2 голосов
/ 03 марта 2010

IronRuby и VS2010 noob вопрос:

Я пытаюсь сделать всплеск, чтобы проверить выполнимость взаимодействия между проектом C # и существующим RubyGem, а не заново изобретать это конкретное колесо в .net. Я скачал и установил IronRuby и пакет RubyGems, а также гем, который я в конечном итоге хотел бы использовать.

Запуск .rb файлов или работа в консоли iirb Ruby без проблем. Я могу загрузить как пакет RubyGems, так и сам гем и использовать его, поэтому, по крайней мере, для этого случая моя среда настроена правильно.

Однако, когда я пытаюсь сделать то же самое из консольного приложения C # (4.0), он жалуется на самую первую строку:

require 'RubyGems'

с ошибкой:

 no such file to load -- rubygems

Моё консольное приложение выглядит так:

using System;
using IronRuby;
namespace RubyInteropSpike
{
    class Program
    {
        static void Main(string[] args)
        {
            var runtime = Ruby.CreateRuntime();

            var scope = runtime.ExecuteFile("test.rb");
            Console.ReadKey();
        }
    }
}

Удаление зависимостей и просто выполнение каких-то базовых самодостаточных вещей Ruby работает нормально, но, похоже, включение любого вида оператора require требует сбоя.

Я надеюсь, что мне просто нужно передать некоторую дополнительную информацию (пути и т. Д.) В среду исполнения ruby, когда я ее создаю, и очень надеюсь, что это не какое-то ограничение, потому что это меня расстроит.

1 Ответ

6 голосов
/ 03 марта 2010

Краткий ответ: Да, это будет работать так, как вы хотите.Вам нужно использовать метод SetSearchPaths движка, чтобы делать то, что вы хотите.

Более полный пример(Предполагается, что вы загрузили IronRuby в C: \ IronRubyRC2 в качестве каталога установки root)

    var engine = IronRuby.Ruby.CreateEngine();

    engine.SetSearchPaths(new[] {
        @"C:\IronRubyRC2\Lib\ironruby",
        @"C:\IronRubyRC2\Lib\ruby\1.8",
        @"C:\IronRubyRC2\Lib\ruby\site_ruby\1.8"
    });

    engine.Execute("require 'rubygems'"); // without SetSearchPaths, you get a LoadError
    /*
    engine.Execute("require 'restclient'"); // install through igem, then check with igem list
    engine.Execute("puts RestClient.get('http://localhost/').body");
    */
    Console.ReadKey();

...