9

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

Sass 包是你必须安装的东西,使用“gem install”或“rake install”——这样做会在我的 ~/.gem 目录中放置大量文件。因为我希望任何安装了我的基于 Cocoa 的应用程序的人都能够从我的应用程序中执行这个工具,所以我不想让用户经历安装任何其他东西的过程,所以我希望能够将我需要的所有内容嵌入到我的应用程序包的 Resources 目录中。

但是,由于对 Ruby 的内部结构和结构不太熟悉(抱歉,我无法将 ObjC/Cocoa 留在脑海中!),我不清楚 ~/ 中安装的 1,444 个文件中的哪一个.gem 目录(是的,我数过)我需要嵌入应用程序以及我可能需要做什么才能使目录引用等正常工作。

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

4

3 回答 3

1

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

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。

于 2013-10-18T16:59:39.190 回答
1

非常感谢@Jacob Lukas,我发现简单地设置 GEM_HOMEgem install <gem>并没有正确附加依赖项。所以,对于我的情况——我只需要运行我在 Xcode 插件中生成的脚本——我最终得到:

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

获取 gem(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];
于 2014-12-17T00:58:24.907 回答
0

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

第 1 步:安装宝石

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

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

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

通过选择 Editor > Add Build Phase > Add Copy Files Build Phase,将 Copy Files 构建阶段添加到您的应用程序目标。使用“资源”菜单选择复制应用程序包中 Gem 的位置。如果您希望 gem 位于它们自己的文件夹中,请在 Subpath 文本字段中添加文件夹名称。

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

第 3 步:在 app bundle 中找到 gems 文件夹

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

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

第四步:配置命令运行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

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

第 5 步:运行 gem

在 macOS 10.13 及更高版本上,调用该run函数来运行 gem。

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

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

taskToRun.launch()

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

在 Mac 应用程序中使用 Ruby Gem

于 2019-01-07T03:42:46.080 回答