前一段时间,我不得不使用XCode创建同一个应用程序的两个版本(比如一个Lite和一个付费的例子)。这很简单,使用预处理器定义添加第二个目标,并在代码中使用
#if defined(SOME_DEFINE)
[some code];
#else
[some otherCode];
#endif
我现在必须使用Rubymotion来做同样的事情。最好的方法是什么?
答案 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