Как встроить ruby gem в проект C# и потребовать его от встроенного скрипта IronRuby?

у меня есть проект C#, в который я встроил программу IronRuby. Проект (включая мой скрипт ruby) компилируется в an .exe-файл в Visual Studio 2010 для распространения. Я использую шаблон, подобный этому, для загрузки скрипта IronRuby:http://pastebin.com/NKes1cyc (и Джимми Schementi идет более подробно здесь: http://blog.jimmy.schementi.com/2009/12/ironruby-rubyconf-2009-part-35.html).

моя проблема: я хотел бы вставьте gem (json_pure) в мою сборку C# и вызовите его из сценария ruby.

некоторые ресурсы, которые я нашел:

  1. В JRuby вы можете легко упаковать драгоценный камень в файл jar, а затем просто потребовать файл jar во время выполнения - http://blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar

  2. инструмент irpack (at http://github.com/kumaryu/irpack) способен компилировать Ruby в an .исполняемый (Я думаю, что он динамически создает и компилирует проект C#) при встраивании стандартной библиотеки ruby. Но, похоже, это только врезать встроенные IronRuby .это не Рубин .файлы rb. Подход, который использует этот инструмент, будет работать, если я смогу выяснить, как скомпилировать исходные файлы Ruby в a .файл DLL.

как встроить IronRuby камень в сборку C# (или составить IronRuby камень на .библиотека DLL)?

EDIT:

страница 472 из IronRuby В Действии ("использование внешних библиотек") объясняет, как требовать стандартные библиотеки ruby из встроенного файла ruby. Он включает в себя добавление папок в коллекцию путей поиска во время выполнения следующим образом (отредактировано для краткости и ясности):

ScriptEngine engine = IronRuby.Ruby.CreateEngine();
var searchPaths = engine.GetSearchPaths().Concat(new[] 
{
    "C:Program Files (x86)IronRuby 1.1Libruby1.9.1",
    "C:Program Files (x86)IronRuby 1.1Libironruby"
});
engine.SetSearchPaths(searchPaths)

этот подход предполагает, что на хост-машине установлен IronRuby, но я хочу встроить файлы ruby (из драгоценного камня) в сборку, чтобы ее можно было запустить без предварительной установки IronRuby.

изменить 2 (дополнительные исследования):

читая исходный код упомянутого выше инструмента irpack, я замечаю, что Kumaryu внедряет ресурсы в окончательную сборку через систему.ИО.Упаковка.Класс пакета, а затем передача пакета в вызов msbuild (см.https://github.com/kumaryu/irpack/blob/master/lib/irpack/packager.rb). Возможно, некоторые дальнейшие исследования в области упаковки файлов в исполняемый файл приведут к решению. Проблема в том, что рубиновые файлы в драгоценном камне require другие файлы Ruby... может ли файл ruby в пакете сборки require другие файлы ruby в том же пакете?

EDIT 3:

Я еще не получил ответа, но мне было бы интересно услышать чьи-либо отзывы, даже если это просто ссылка или предложение о том, где искать. Я новичок в msbuild, и документация довольно здоровенная. Первоначальный веб-поиск "MSBuild embed zip package" ничего не показал соответствующий.

3 ответов


Require-это метод Это можно переопределить, как и любой другой метод ruby. Я думаю, что так работал оригинальный пакет ruby gems, gems просто переопределит require.

Если вы можете упаковать драгоценный камень в свой .exe как-то, вы можете переопределить require для загрузки из сборки.


Я работаю с https://stackoverflow.com/users/2086/mcintyre321 чтобы получить его библиотеку, завернутую в C# / IronRuby, используя мой код упаковки (https://github.com/rifraf/IronRubyAppPackager#readme).

на шаге vendorize необходимы некоторые исправления, связанные с более поздними версиями Ruby с внедренными RubyGems, а не загруженными, но прогресс достигается.

его код требует 'JSON' и у меня есть трюк, чтобы заставить его чтобы использовать реализацию Ruby, а не c-linkage .Итак, файлы. Это должно означать, что он будет работать с IronRuby ok. Сообщит назад, или чувствует свободным связаться я с источником который вы хотите бежать.


попробуйте это https://github.com/rifraf/IronRubyAppPackager#readme (или подождите, пока я сообщу, работает ли он с библиотекой, которую я пытаюсь внедрить)

Reporting back:

процесс, к которому я пошел, есть...

  1. вилка и подмодуль все проекты (IronRubyEmbeddedApps, IronRubyAppPackager, крепостные и Vendorize) из https://github.com/rifraf, и добавил их все в решение VS. Я обновил все проекты .NET4 и заставил их ссылаться друг на друга, а не на включенные .net2 сборки

  2. выполнена Vendorize, чтобы разорвать все зависимости/камни D:\projects\SomeLibrary\lib_vendor_ работает:

    D:\projects\SomeLibrary\lib>ruby -I..\..\Vendorize\lib -rvendorize some_lib.rb

  3. создается проект C# в D:\projects\SomeLibrary\lib\_IRPackager_\some_lib.csproj работает:

    D:\projects\SomeLibrary\lib>ruby -I..\..\IronRubyAppPackager\lib\IRPackager.rb some_lib.rb

  4. добавлен some_lib.csproj для моего решения, обновил его .net4 и фиксированный ссылки

  5. на данный момент Вы можете запустить проект в .NET, standalone, запустив
var Ruby = new EmbeddedRuby();
Ruby.Decoder = new Program.GZipDecoder();
Ruby.Mount("App");
Ruby.Run("gocardless.rb");

и это ему удалось! Блестяще, подумал я!

на самом деле в этот момент я обнаружил, что на Шаге 2 не удалось Вендоризировать каждую требуемую библиотеку. Vendorize работает путем перехвата require вызовы, а затем сохранение вызванных файлов rb в _Vendor_ - если require не выполняется (поэтому запустите все тесты и тест надежды охват 100%) он не будет подобран.

по какой-то причине он не забирал один из необходимых файлов, хотя и было требование. В конце концов, я вручную создал контент для продавец каталог, скопировав мою библиотеку и используя . Повторите шаги 3 и 4, и я закончу... правильно?

Нет, я получаю некоторую ошибку о no such file to load -- json/pure когда я запускаю сгенерированный проект-я думаю, что это что-то, чтобы сделать комбинацию ironruby не имея осуществление встроенный JSON, я делаю инструкцию vendorizing и мне не пришлось починить вещи сегодня в нескольких точках.

в заключение-этот метод очень почти работает, будет работать, если ваша библиотека и ее зависимости работают с ironruby правильно, и вы можете заставить vendorize работать правильно.

Я сдаюсь и портирую библиотеку на c# по старинке.

edit: как упоминалось ниже, rifraf помогает мне и изучает обновление инструменты, которые я использовал. смотреть t(свое) место!