【问题标题】:How to distribute multiple variants of a cocoa framework如何分发可可框架的多个变体
【发布时间】:2013-03-21 20:27:37
【问题描述】:

我有一个想要分发的 Cocoa 框架。对于不想将其作为子模块引入并自己构建的人,我想提供一个预构建版本:ECLogging.framework。

问题在于,该框架的 Debug/Release 变体具有不同的行为(不仅仅是不同的编译器选项,还可能实际执行不同的代码)。

什么是最惯用的分发方式以及人们设置他们的 Xcode 项目的方式?

我希望人们能够执行 #import ,因此我无法将框架的调试版本重命名为 ECLoggingDebug.framework(例如)。

所以我可以在这样的文件夹中给他们框架: ECLogging/ 调试/ ECLogging.framework 释放/ ECLogging.framework

然后人们可以很容易地设置一个框架搜索路径 ECLogging/$(CONFIGURATION)/,它将选择正确的路径。

这在编译和链接期间工作正常,但您还需要将正确的版本嵌入到构建的应用中。

在 Copy Files 阶段(进行嵌入的正常方式),Xcode 想知道它的真正位置,我认为我无法以某种方式使用环境变量来告诉它。

当然,我可以编写一个脚本,它只是复制它。我对此很好,但必须要求框架的用户这样做似乎很笨拙。

有没有更好的办法?

【问题讨论】:

  • 调试和发布版本是否需要具有不同的编译器设置(当您构建它们时),或者不同的行为是必不可少的吗?
  • 一般来说,唯一的编译器选项差异是正常的符号/优化设置。让预构建版本仅使用发布设置可能是可以接受的。

标签: objective-c xcode cocoa frameworks


【解决方案1】:

假设我正确理解了场景,这就是我要做的。我只会制作一个版本的框架。我不会让框架的行为依赖于编译时调试/发布配置(大概使用#ifdefs 等),而是使用(框架)全局变量来指示调试与发布模式。我会添加一个简单的方法来打开调试模式(例如[ECLogging setDebugModeEnabled:YES]),用户可以在启动时调用它来更改框架的行为。然后,对他们来说很容易:

#if DEBUG
[ECLogging setDebugModeEnabled:YES];
#endif

【讨论】:

  • 通常我也会这样做,但在这种特殊情况下可能会影响性能。不过我想我可能不得不走那条路。
  • 我很好奇可能的性能影响。检查全局 DebugModeEnabled 变量值的条件应该非常快...
  • 其实我稍微简化了一下,不仅仅是性能的问题。您可能想要实际排除代码还有其他原因 - 例如,框架的调试版本可能想要使用发布版本绝对不能使用的一些未记录/私有 API。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多