2010-06-19 35 views
8

我試圖弄清楚如何將一個用Ruby編寫的包(Sass)打包成一個Cocoa應用程序(Objective-C,而不是Ruby Cocoa)來執行(通過NSTask很好,除非有一個簡單的方式來橋樑ObjC < - >可可,我不知道)。如何將ruby包捆綁到[Objective-C]可可應用程序中?

Sass包是你必須安裝的東西,使用「gem install」或「rake install」 - 這樣做會在我的〜/ .gem目錄中放入一個文件。因爲我希望任何安裝了我的基於Cocoa的應用程序的人都能夠在我的應用程序中執行此工具,所以我不想讓用戶通過一個額外安裝任何東西的過程,所以我希望能夠在我的應用程序包的資源目錄中嵌入我需要的所有內容。

然而,不是那麼熟悉的Ruby (對不起,我有隻是保持ObjC /可可在我腦海中的麻煩!)的內部和結構,這不是很清楚,我只是其中的1444文件,這些文件已經安裝在〜/ .gem目錄中(是的,我算過)我需要在應用程序中嵌入,以及我可能需要做些什麼來獲取目錄引用等。

如果任何人有任何將紅寶石工具嵌入到Cocoa應用程序的經驗,我會非常感謝您的意見。考慮到安裝在Mac OS X上的ruby ......但顯然這個軟件包(通常是非典型的)不僅僅是一個腳本文件......

回答

1

您可以安裝寶石到一個特定的位置:

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

然後,作爲構建過程的一部分,該文件夾複製到你的資源。當你想運行sass時,找到你的寶石文件夾。調用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上,可能有愚蠢的錯誤),您可能要捆綁紅寶石以及(也許MacRuby的)

注意,以防止兼容性問題。如果不是,請確保您測試了您支持的所有OS X版本,尤其是10.9,因爲ruby已升級到2.0。

1

非常感謝@Jacob Lukas,我發現只需在gem install <gem>上設置GEM_HOME就沒有正確附加依賴關係。所以,我的情況 - 在那裏我只需要運行一個腳本,我生成一個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]; 
相關問題