安装自定义cocoa框架的最佳方法

安装自定义cocoa框架的最佳方法,cocoa,xcode,frameworks,xcodebuild,Cocoa,Xcode,Frameworks,Xcodebuild,我有一个定制的框架,按照Apple的框架编程指南>>中的建议,我在/Library/Frameworks中安装了它。为此,我使用以下脚本添加运行脚本构建阶段: cp -R build/Debug/MyFramework.framework /Library/Frameworks 在我的项目中,我然后链接到/Library/Frameworks/MyFramework,并将其导入到我的类中,如下所示: #import <MyFramework/MyFramework.h> 但这感

我有一个定制的框架,按照Apple的框架编程指南>>中的建议,我在/Library/Frameworks中安装了它。为此,我使用以下脚本添加运行脚本构建阶段:

cp -R  build/Debug/MyFramework.framework /Library/Frameworks
在我的项目中,我然后链接到/Library/Frameworks/MyFramework,并将其导入到我的类中,如下所示:

#import <MyFramework/MyFramework.h>

但这感觉就像塞洛录制了一些不应该被打破的东西。如何解决这个问题?

当然,当您发布框架时,它应该安装在/Library/Frameworks中;然而,对于我来说,使用框架的测试/调试版本来实现这一点似乎很奇怪

我的第一反应是在~/Library下安装测试版本,因为这会使设置测试和调试环境变得更简单。如果可能的话,我希望调试/测试框架位于我正在测试的版本的构建树中,在这种情况下,它是作为测试目的而安装的。当需要处理框架的多个版本时,这将使您的生活更加简单


最终,只要应用程序或测试套件加载正确的版本,框架位于何处并不重要。选择最容易进行测试/调试/开发的位置。

没有太多理由将框架放入库/框架中,而且这需要大量的工作:您需要在安装程序包中为用户完成这项工作,这对于创建和维护来说非常麻烦,或者在应用程序中包含安装代码(只能安装到~/L/F,除非您花费必要的时间和精力使您的应用程序能够使用root权限安装到/L/F)

更常见的是。您将把它捆绑到应用程序捆绑包中


实际上,即使是任何应用程序(如Sparkle、Growl)通用的框架,也被构建为用作私有框架,这仅仅是因为“正确的”将框架的单个副本安装到库/框架的方法非常麻烦。

传统的方法是让框架项目及其客户端共享一个公共构建目录。Xcode将首先搜索构建文件夹中的框架标题并链接框架二进制文件,然后再搜索其他位置。因此,ap编译并链接标题的p项目将选择最近构建的一个,而不是安装的任何东西


然后,您可以删除cp-r,而是使用命令行上的xcodebuild Install DSTROOT=/使用Install Location build设置将构建产品放置在最终位置。但您只需要在完成后执行此操作,而不是每次重新构建框架时。

在过去的几个月里,我学到了很多关于框架的知识工作正常,所以我重写了这个答案。请注意,我说的是作为开发工作流程的一部分安装框架

安装公共框架(即将由多个应用程序或捆绑包使用的框架)的首选位置是/Library/Frameworks[链接文本],因为“编译器在编译时自动发现此位置的框架,而动态链接器在运行时自动发现此位置的框架。”[框架编程指南]。最优雅的方法是在“生成设置”的“部署”部分

当您在框架上工作时,有时您确实希望在生成时更新框架,有时则不希望。因此,我仅在发布配置中更改部署设置。因此:

  • 双击框架目标以打开目标信息窗口并切换到Build选项卡
  • 在配置选择框中选择释放
  • 向下滚动至展开部分,然后输入以下值:
  • 部署位置=是(单击复选框)

    安装生成产品位置=/

    安装目录=/Library/Frameworks

    Installation Build Products位置作为安装的根目录。它的默认值是some/tmp目录:如果不将其更改为系统根目录,您将永远看不到已安装的框架,因为它隐藏在/tmp目录中

    现在,您可以在调试配置中随心所欲地处理框架,而不会打乱其他项目,并且当您准备发布时,您所需要做的就是切换到发布并进行构建

    Xcode 4警告
    自从切换到Xcode 4以来,我的自定义框架遇到了许多问题。大多数情况下,它们都是在GDB中链接警告,这些警告不会真正影响框架的实用性,除非在运行内置单元测试时。我一周前向苹果提交了一份技术支持通知单,他们仍在调查。什么时候我得到了一个可行的解决方案,我将更新这个答案,因为这个问题已经证明非常流行(1 kView和计数)。

    由于该框架已被多个项目使用,将其作为私有框架安装是不可行的。我在发布版本(cp-R build/release/MyFramework.framework/Library/Frameworks)中也尝试过同样的方法但是结果是一样的。至于它,框架位于何处并不重要,只要…--好吧,我说不出话来。有趣的是,我发现这种方法有两个问题。首先,xcodebuild install DSTROOT=/确实解决了“无法读取符号”的问题。但是:1)当框架的构建目录指向公共构建目录(在项目文件夹之外)时,xcodebuild会忽略框架中所做的更改。框架头文件的修改日期会改变,但内容不会改变(可能与版本控制有关?)。2) 当我将构建目录更改回默认构建时,xcodebuild将在框架内安装框架的另一个副本。奇怪的是,你应该考虑CdxPiNoSA关于XCOD的任何答案。
    cp -R  build/Debug/MyFramework.framework ~/Library/Frameworks