У меня есть проект на C #, в который я встроил программу IronRuby. Проект (включая мой скрипт ruby) скомпилирован в файл .exe в Visual Studio 2010 для распространения. Я использую шаблон, подобный этому, для начальной загрузки скрипта IronRuby: http://pastebin.com/NKes1cyc (и Джимми Схементи более подробно расскажет здесь: http://blog.jimmy.schementi.com/2009/12/ironruby-rubyconf-2009-part-35.html).
Моя проблема: я хотел бы встроить гем (json_pure) в мою сборку C # и вызвать его из сценария ruby.
Некоторые ресурсы, которые я нашел:
В JRuby вы можете легко упаковать гем в файл jar, а затем просто потребовать файл jar во время выполнения - http://blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar
Инструмент irpack (на http://github.com/kumaryu/irpack) способен компилировать Ruby в .exe (я думаю, что он динамически создает и компилирует проект C #) при встраивании стандартной библиотеки ruby. Но похоже, что это так только встраивает предварительно созданные файлы IronRuby .dll, а не файлы ruby .rb. Подход, который использует этот инструмент, сработал бы, если бы я смог выяснить, как скомпилировать исходные файлы Ruby в .dll.
Как встраивать гем IronRuby в сборку C # (или компилировать гем IronRuby в .dll)?
РЕДАКТИРОВАТЬ:
Страница 472 из IronRuby In Action («Использование внешних библиотек») объясняет, как требовать стандартные библиотеки ruby из встроенного файла ruby. Он включает добавление папок в коллекцию путей поиска во время выполнения следующим образом (отредактировано для краткости и ясности):
ScriptEngine engine = IronRuby.Ruby.CreateEngine();
var searchPaths = engine.GetSearchPaths().Concat(new[]
{
"C:\\Program Files (x86)\\IronRuby 1.1\\Lib\\ruby\\1.9.1",
"C:\\Program Files (x86)\\IronRuby 1.1\\Lib\\ironruby"
});
engine.SetSearchPaths(searchPaths)
В этом подходе предполагается, что на хост-машине установлен IronRuby, но я хочу встроить файлы ruby (из гема) в сборку, чтобы ее можно было запускать без предустановленной версии IronRuby.
РЕДАКТИРОВАТЬ 2 (дальнейшее исследование):
Читая исходный код инструмента irpack, упомянутого выше, я заметил, что Kumaryu встраивает ресурсы в окончательную сборку через класс System.IO.Packaging.Package, а затем передает пакет в вызов msbuild (см. https://github.com/kumaryu/irpack/blob/master/lib/irpack/packager.rb). Возможно, некоторые дальнейшие исследования по упаковке файлов в исполняемый файл приведут к решению. Проблема, которую я вижу, состоит в том, что файлы ruby в геме require
другие файлы ruby ... могут быть файлом ruby в пакете сборки require
другие файлы ruby в том же пакете?
РЕДАКТИРОВАТЬ 3:
Я еще не дошел до ответа, но мне было бы интересно услышать чей-либо отзыв, даже если это просто ссылка или предложение о том, где искать. Я новичок в msbuild, и документация довольно здоровенная. Первоначальный веб-поиск "msbuild embed zip package" не выявил ничего уместного.