2010-06-19 28 views
8

Tôi đang cố gắng tìm ra cách tôi có thể gói một gói, viết bằng Ruby (Sass) vào một ứng dụng Cocoa (Objective-C, không phải Ruby Cocoa) để tôi thực hiện (thông qua NSTask là tốt, trừ khi có một cách dễ dàng cách để kết nối ObjC < -> Ca cao mà tôi không biết).Làm thế nào để gói một gói ruby ​​thành ứng dụng ca cao [Objective-C]?

Gói Sass là thứ bạn phải cài đặt, sử dụng "cài đặt đá quý" hoặc "cài đặt cào" - làm như vậy đặt tấn tệp trong thư mục ~/.gem của tôi. Vì tôi muốn bất kỳ ai đã cài đặt ứng dụng dựa trên Cocoa của mình để có thể thực thi công cụ này từ bên trong ứng dụng của tôi, tôi không muốn người dùng trải qua quá trình cài đặt thêm bất kỳ thứ gì, vì vậy tôi hy vọng có thể để nhúng mọi thứ tôi cần vào thư mục Tài nguyên của gói ứng dụng của tôi.

Tuy nhiên, không phải là những gì quen thuộc với internals hạn và cơ cấu của Ruby (Xin lỗi, tôi đang gặp rắc rối chỉ giữ ObjC/Cocoa trong đầu của tôi!), Nó không phải rõ ràng với tôi chỉ nào trong số 1.444 file đã được cài đặt trong thư mục ~/.gem (Có, tôi đã tính) Tôi cần nhúng vào ứng dụng và những gì tôi có thể cần làm để có được các tham chiếu thư mục, v.v. hoạt động đúng.

Nếu bất kỳ ai có bất kỳ trải nghiệm nào khi nhúng công cụ ruby ​​vào ứng dụng Cocoa, tôi thực sự đánh giá cao ý kiến ​​của bạn. Tôi đã không mong đợi điều này là khó khăn như vậy, xem xét rằng ruby ​​ được cài đặt trên Mac OS X ... nhưng rõ ràng gói này là (thường? Atypically?) Nhiều hơn chỉ là một tập lệnh duy nhất ....

Trả lời

1

Bạn có thể cài đặt đá quý vào một địa điểm cụ thể:

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

Sau đó, như một phần của quá trình xây dựng, hãy sao chép thư mục vào tài nguyên của bạn. Khi bạn muốn chạy sass, hãy tìm thư mục gem của bạn. Gọi ruby ​​như vậy:

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]; 

(Typed vào github, có thể có sai lầm ngớ ngẩn)

Lưu ý rằng bạn có thể muốn bó ruby ​​cũng (có lẽ macruby), để ngăn chặn vấn đề tương thích. Nếu không, hãy đảm bảo rằng bạn kiểm tra tất cả các phiên bản OS X mà bạn hỗ trợ, đặc biệt là 10,9, khi ruby ​​được nâng cấp lên 2.0.

1

Chính nhờ @Jacob Lukas, tôi thấy rằng chỉ cần đặt GEM_HOME trên gem install <gem> không đính kèm chính xác các phụ thuộc. Vì vậy, đối với trường hợp của tôi - nơi tôi chỉ cần chạy một kịch bản tôi là tạo ra trong một plugin Xcode - tôi đã kết thúc với:

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

để có được những viên ngọc (s) & phụ thuộc. Sau đó, tôi đã sử dụng:

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]; 
Các vấn đề liên quan