Как связать пакет ruby ​​в приложение [Objective-C] для какао? - PullRequest
9 голосов
/ 19 июня 2010

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

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

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

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

Ответы [ 3 ]

1 голос
/ 17 декабря 2014

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

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

, чтобы получить гемs) & зависимости.Тогда я использовал:

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];
1 голос
/ 18 октября 2013

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

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.

0 голосов
/ 07 января 2019

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

Шаг 1. Установите Gems

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

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

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

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

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

Шаг 3: Найдите папку с драгоценными камнями в комплекте приложения

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

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

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

Используйте класс Process, ранее NSTask, для запуска программы командной строки, такой как gem.Начните с создания 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...