Rubymotion - 具有相同代码的多个目标

时间:2014-05-07 15:55:52

标签: objective-c rubymotion

前一段时间,我不得不使用XCode创建同一个应用程序的两个版本(比如一个Lite和一个付费的例子)。这很简单,使用预处理器定义添加第二个目标,并在代码中使用

#if defined(SOME_DEFINE)
  [some code];
#else
  [some otherCode];
#endif

我现在必须使用Rubymotion来做同样的事情。最好的方法是什么?

1 个答案:

答案 0 :(得分:4)

劳伦特在这里回答:https://twitter.com/lrz/status/464079142065930240,我想我会稍微阐述一下。

因此,我们的想法是生成一个包含常量的.rb文件,并编译该文件,并在您的应用程序中提供这些常量。由您决定如何确定值,但我将使用解析ENV变量的示例,例如。

rake some_define=true

在您的Rakefile中:

Motion::Project::App.setup do |app|
  if ENV['some_define'] == 'true' || ENV['some_define'] == '1'
    some_define = true
  else
    some_define = false
  end

  constants_contents = "SOME_DEFINE = #{some_define.inspect}\n"
  File.open('app/.constants.rb', 'w') do |file|
    file.write(constants_contents)
  end

  # add this config file to the beginning of app.files, so you can
  # use the constant anywhere
  app.files.insert(0, 'app/.constants.rb')
end

现在,您的应用中可以使用SOME_DEFINE;不像#define宏那么优雅,但最终结果几乎相同。

如果[some code][some otherCode]数量巨大,则应将其放在单独的文件中,然后您可以有条件地包含这些文件。在这种情况下,请不要将它们放在app/中,将它们放在platform/或类似内容中,然后:

Motion::Project::App.setup do |app|
  if ENV['some_define'] == 'true' || ENV['some_define'] == '1'
    app.files.insert(0, 'platform/special.rb')
  else
    app.files.insert(0, 'platform/default.rb')
  end
end