1. Getting started

RubyMotion은 루비로 문법의 정적 빌드여서 기존의 루비 gem은 RubyMotion에서는 동작하지 않습니다. RubyMotion gem은 RubyMotion의 구조에 맞춰 만들어야 합니다.

RubyMotion에서 gem은 프로젝트의 'Rakefile'에서 require해야하고, 프로젝트의 설정을 추가할 책임이 있습니다. 예를들자면 프로젝트에 파일을 추가하거나 새로운 rake 태스크를 만들거나 하는 일이 있겠네요.

이 문서에서는 가상의 foo gem을 기준으로 설명하겠습니다. foo gem의 파일 트리는 다음과 같습니다.

foo.gemspec
lib
  foo.rb

RubyMotion 프로젝트에서 foo gem을 사용하려면 'Rakefile'에서 require하기만 하면 됩니다.

$:.unshift("/Library/RubyMotion/lib")
require 'motion/project'

require 'rubygems'
require 'foo'

# ...
Note require "rubygems" 은 Ruby 1.9를 사용하신다면 필요 없습니다.

foo.rb 파일은 gem의 진입지점 입니다. 밑의 코드로 RubyMotion밖에서 이 파일이 로드되지 않도록 보호해두는 것도 좋습니다.

unless defined?(Motion::Project::Config)
  raise "This file must be required within a RubyMotion project Rakefile."
end

2. Adding source files

Gem은 RubyMotion프로젝트에 파일을 간단히 추가할 수 있습니다. Motion::Project::App 블록을 열어 app.files 에 파일경로를 추가하기만 하면 됩니다.

예를들어 RubyMotion프로젝트에 추가할 lib/foo 디렉토리 안에 파일들을 가지고있는 foo gem있다고 합시다.

foo.gemspec
lib
  foo.rb
  foo
    foo-model.rb
    foo-view.rb
    foo-controller.rb

'lib/foo.rb'은 다음과 같이 수정하면 됩니다.

unless defined?(Motion::Project::Config)
  raise "This file must be required within a RubyMotion project Rakefile."
end

Motion::Project::App.setup do |app|
  Dir.glob(File.join(File.dirname(__FILE__), 'foo/*.rb')).each do |file|
    app.files.unshift(file)
  end
end

foo-model.rb, foo-view.rb, foo-controller.rb 파일은 빌드 시스템에 의해 다른파일들 보다 먼저 컴파일되고 사용됩니다.

3. Adding dependencies

foo gem 에서의 파일추가엔 재한이 없습니다. Motion::Project::Config 오브젝트에 대한 접근권을 가지므로, 프로젝트의 설정과 동등한 접근권을 가지고 있게 됩니다.

예를들어, foo gem에 Objective-C 소스코드가 있다고 합시다.

foo.gemspec
lib
  foo.rb
  ...
vendor
  native-foo
    native-foo-model.{m,h}
    native-foo-view.{m,h}
    native-foo-controller.{m,h}

이 코드는 엡에 링크하기위해 CoreData 프레임워크를 필요로 한다고 하면,

foo.rb 에 vendor의 네이티브 코드의 프레임워크 의존성을 넣을수 있습니다.

unless defined?(Motion::Project::Config)
  raise "This file must be required within a RubyMotion project Rakefile."
end

Motion::Project::App.setup do |app|
  Dir.glob(File.join(File.dirname(__FILE__), 'foo/*.rb')).each do |file|
    app.files.unshift(file)
  end
  app.vendor_project(File.expand_path(File.join(File.dirname(__FILE__), '../vendor/native-foo')), :static)
  app.frameworks += ['CoreData']
end

4. Adding rake tasks

RubyMotion gem은 새로운 rake 태스크를 추가함으로써 쉽게 빌드시스템을 확장할 수도 있습니다.

RubyMotion 프로젝트의 Rakefile 에서 foo.rb 파일을 require 하므로, 태스크를 거기에 정의하기만 하면 됩니다.

예를들어 foo 태스크에 상상의 서비스를 연결하려면 이렇게 하면 됩니다.

unless defined?(Motion::Project::Config)
  raise "This file must be required within a RubyMotion project Rakefile."
end

Motion::Project::App.setup do |app|
  ...
end

desc "Submit your code to the foo service"
task :foo do
  ...
end