如何将ruby包捆绑到[Objective-C]可可应用程序中?

时间:2010-06-19 05:01:37

标签: objective-c ruby cocoa sass

我正在试图弄清楚如何将用Ruby(Sass)编写的包捆绑到Cocoa应用程序(Objective-C,而不是Ruby Cocoa)中供我执行(通过NSTask很好,除非有一种简单的方法来桥接我不知道的ObjC< - > Cocoa。)

Sass软件包是您必须使用“gem install”或“rake install”安装的 - 这样做会在我的〜/ .gem目录中放入 ton 文件。由于我希望安装了基于Cocoa的应用程序的任何人能够在我的应用程序中执行此工具,我不希望让用户经历一个额外的安装过程,所以我希望能够将我需要的所有内容嵌入到我的应用包的Res​​ources目录中。

然而,不熟悉Ruby 的内部和结构(对不起,我只是把ObjC / Cocoa保留在我的头脑中了!),我不清楚哪个是安装在〜/ .gem目录中的1,444个文件(是的,我算了)我需要嵌入到应用程序中以及我可能需要做什么来获取目录引用等工作正常

如果有人有任何将ruby工具嵌入Cocoa应用程序的经验,我将非常感谢您的意见。考虑到在Mac OS X上安装了ruby ,我并没有想到会这么难......但显然这个软件包(通常是非典型的?)不仅仅是一个脚本文件。 ..

3 个答案:

答案 0 :(得分:1)

您可以将宝石安装到特定位置:

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

然后,作为构建过程的一部分,将文件夹复制到资源中。当你想运行sass时,找到你的gem文件夹。像这样打电话给ruby:

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。

答案 1 :(得分:1)

主要感谢@Jacob Lukas,我发现只是在gem install <gem>上设置GEM_HOME没有正确附加依赖项。所以,对于我的情况 - 我只需要运行一个我在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];

答案 2 :(得分:0)

我在使用Ruby宝石做类似的事情时遇到了麻烦,所以我将分享对我有用的东西,希望它对以后的人有所帮助。

步骤1:安装宝石

首先将要使用的gem安装到您可以轻松找到的文件夹中,例如项目文件夹中的gems文件夹。正如Stan在回答中所显示的那样,在安装gem时,请使用-i选项并提供gems文件夹的路径。

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

第2步:添加复制文件构建阶段

通过选择编辑器>添加构建阶段>添加复制文件构建阶段,将复制文件构建阶段添加到您的应用程序目标。使用资源菜单选择一个位置来复制应用程序捆绑包中的宝石。如果要将宝石放在它们自己的文件夹中,请在“子路径”文本字段中添加文件夹名称。

单击“添加”按钮添加文件。一张纸打开。单击添加其他按钮。导航到您的gem文件夹位置,然后选择您的gem文件夹。 现在,当您构建项目时,Xcode将把gems复制到应用程序包中。

第3步:在应用程序捆绑包中找到gems文件夹

使用Bundle类在分发包中找到标准位置,例如Resources文件夹。建立gems文件夹的路径。运行gem时,您将需要使用它作为环境变量。

包含gems的文件夹应具有一个包含可执行文件的bin文件夹。您将构建可执行文件的路径,并在运行gem时将该路径用作第一个参数。

步骤4:配置命令以运行gem

使用Process类(以前为NSTask)来运行命令行程序,例如gem。首先创建一个Process对象。

let taskToRun = Process()

将启动路径设置为Ruby解释器的路径。

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

将环境变量GEM_HOME设置为gems文件夹的路径。

taskToRun.environment = ["GEM_HOME" : gemsPath]

使用参数列表设置arguments属性。第一个参数应该是gem的可执行文件的路径。

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

实际参数列表取决于您使用的宝石。

第5步:运行gem

在macOS 10.13和更高版本上,调用run函数以运行gem。

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

在早期版本的macOS上,调用函数launch运行gem。

taskToRun.launch()

您可以在以下文章中找到更多详细信息:

Using a Ruby Gem in a Mac App