Как связать пакет ruby ​​в приложение [Objective-C] для какао?

Я пытаюсь выяснить, как я могу связать пакет, написанный на Ruby ( Sass), в приложение Какао (Objective-C, а не Ruby Cocoa), которое я могу выполнить (с помощью NSTask - это нормально, если нет простого способа Мост ObjC <-> Какао, о котором я не знаю).

Пакет Sass - это то, что вы должны установить, используя "gem install" или "rake install" - таким образом, вы помещаете тонну файлов в мою директорию ~/.gem. Поскольку я хочу, чтобы любой, кто установил мое приложение на основе какао, мог запускать этот инструмент из моего приложения, я не хочу, чтобы пользователь проходил через процесс установки чего-либо дополнительного, поэтому я надеюсь, что смогу встроить все, что мне нужно, в каталог ресурсов моего пакета приложения.

Однако, не зная, что такое внутреннее устройство и структура Ruby (извините, у меня проблемы с тем, чтобы просто держать ObjC/Cocoa в голове!), Мне не ясно, какой из 1444 файлов был установлен в ~ / Каталог.gem (Да, я посчитал) Мне нужно встроить в приложение и что мне, возможно, нужно сделать, чтобы ссылки на каталоги и т. д. работали правильно.

Если у кого-то есть опыт встраивания инструмента ruby ​​в приложение Cocoa, я был бы очень признателен за ваш вклад. Я не ожидал, что это будет так сложно, учитывая, что ruby ​​установлен в Mac OS X ... но, очевидно, этот пакет (как правило, нетипично) больше, чем просто один файл сценария....

3 ответа

Большое спасибо Jacob Lukas, я обнаружил, что просто установив GEM_HOME на gem install <gem> неправильно прикрепил зависимости. Итак, для моего случая - где мне просто нужно запустить скрипт, который я генерирую в плагине XCode - я в итоге получил:

gem install -i ~/xCodeProjects/PluginOne/gems xcodeproj --verbose

чтобы получить драгоценный камень (ы) и зависимости. Затем я использовал:

NSString *gems_path = [[bundle resourcePath] stringByAppendingString:@"/gems"];

NSTask *task = [[NSTask alloc] init];
task.environment = @{ @"GEM_HOME" : gems_path };
task.launchPath = @"/System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/ruby";
task.arguments = @[generatedRubyFilePath];

[task launch];

Вы можете установить драгоценные камни в определенном месте:

GEM_HOME=path/to/your/project/gems gem install sass

Затем, как часть процесса сборки, скопируйте папку в свои ресурсы. Если вы хотите запустить sass, найдите папку с самоцветами. Назовите рубин так:

NSString *gems_path = …;
NSTask *task = [[NSTask alloc] init];
// you may want to copy NSProcessInfo.processInfo.environment and modify it instead
task.environment = @{ @"GEM_HOME": gems_path };
task.launchPath = @"/usr/bin/ruby";
task.arguments = @[[gems_path stringByAppendingPaths:@[@"bin",@"sass"]], @"rest", @"of", @"your", @"arguments"];
// add handling for I/O
[task launch];

(Напечатано в github, могут быть глупые ошибки)

Обратите внимание, что вы можете захотеть также связать ruby ​​(возможно, macruby), чтобы предотвратить проблемы совместимости. Если нет, убедитесь, что вы протестировали все версии OS X, которые вы поддерживаете, особенно 10.9, так как ruby ​​был обновлен до 2.0.

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

Шаг 1: Установите драгоценные камни

Начните с установки драгоценных камней, которые вы хотите использовать, в папку, которую вы можете легко найти, например, gems папка внутри вашей папки проекта. Как показал Стэн в своем ответе, используйте -i опцию и укажите путь к папке с самоцветами при установке самоцвета.

gem install -i /path/to/gem/folder gemName

Шаг 2: Добавить этап сборки Copy Files

Добавьте фазу сборки "Копировать файлы" к цели приложения, выбрав "Редактор"> "Добавить фазу сборки"> "Добавить фазу сборки файлов копирования". Используйте меню Ресурсы, чтобы выбрать место для копирования драгоценных камней в комплекте приложений. Если вы хотите, чтобы драгоценные камни находились в их собственной папке, добавьте имя папки в текстовое поле Subpath.

Нажмите кнопку Добавить, чтобы добавить файлы. Лист открывается. Нажмите кнопку Добавить другое. Перейдите к местоположению вашей папки с драгоценными камнями и выберите вашу папку с драгоценными камнями. Теперь, когда вы строите проект, XCode скопирует драгоценные камни в комплект приложения.

Шаг 3. Найдите папку gems в комплекте приложений.

Использовать Bundle класс для поиска стандартных расположений в комплекте, например, в папке "Ресурсы". Постройте путь к папке с драгоценными камнями. Он понадобится вам как переменная окружения при запуске гема.

Папка с драгоценными камнями должна иметь bin папка, содержащая исполняемые файлы. Вы должны построить путь к исполняемому файлу и использовать этот путь в качестве первого аргумента при запуске гема.

Шаг 4: Настройте команду для запуска драгоценного камня

Использовать Process класс, ранее NSTask, чтобы запустить программу командной строки, такую ​​как гем. Начните с создания Process объект.

let taskToRun = Process()

Установите путь запуска к пути интерпретатора Ruby.

taskToRun.launchPath = "/usr/bin/ruby"

Задайте в переменной среды GEM_HOME путь к вашей папке с драгоценными камнями.

taskToRun.environment = ["GEM_HOME" : gemsPath]

Установить arguments свойство со списком аргументов. Первым аргументом должен быть путь к исполняемому файлу гема.

let argumentList = [gemExecutablePath, inputURL.path, "-o", outputURL.path]
taskToRun.arguments = argumentList

Фактический список аргументов зависит от используемого вами драгоценного камня.

Шаг 5: Запустите драгоценный камень

В macOS 10.13 и более поздних версиях run функция для запуска драгоценного камня.

do {
    try taskToRun.run()
} catch {
    fatalError("Error running command line tool.")
}

В более ранних версиях macOS вызывайте функцию launch запустить драгоценный камень.

taskToRun.launch()

Вы можете найти более подробную информацию в следующей статье:

Использование Ruby Gem в приложении Mac

Другие вопросы по тегам