Как связать пакет 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()
Вы можете найти более подробную информацию в следующей статье: