用于不同构建配置的框架的Xcode项目文件参考路径

时间:2014-09-18 17:27:41

标签: ios xcode macos frameworks

当我尝试构建不同的配置时,我的工作空间中出现“Link Binary with Libraries”和“Copy Files”路径的问题 - “Debug”和“Release”这些路径存储在pbxproj文件中xcodeproj包,不随构建配置而变化。

我有一个工作区Application.xcworkspace,它构建了两个框架和一个使用这些框架的可执行文件。我的派生数据位置设置为“工作区相对”这里大致是如何布局的:

Framework_1 - Built and output to the Derived Data path.

Framework_2 - Depends on Framework_1, which is included in the Frameworks area of the project and specified in the "Link Binary with Libraries" Build Phase, and output to Derived Data path.

Application - Depends on Framework_1 and Framework_2, which are included in the Frameworks area of the project and specified in the "Link Binary with Libraries" Build Phase. Output directory is again the Derived Data path.

引用框架的项目文件中的路径是派生数据路径 - 它们就像

Workspace Path/DerivedData/Workspace Name/Build/Products/Debug/Framework_1.framework  

无论我构建的是什么 - 运行(调试),测试(调试)或分析(发布),该路径都是相同的。

我的问题是当我构建用于分析(发布)时,框架的路径仍然是调试路径,因此应用程序的发布版本链接到调试框架并且调试框架被捆绑到app->内容 - >框架(通过复制文件构建阶段)。更糟糕的是,如果我执行Clean,或者删除Derived Data目录,并尝试构建用于分析(发布),它将不会构建或运行,因为引用的文件(debug)不存在。

我知道一种方法可以让这项工作有两个工作区 - 一个用于调试,另一个用于发布。那将是一个很大的麻烦。

另一种方法是做另一个目标吗?

解决此问题的正确方法是什么?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

我想我找到了解决这个问题的相当简洁的方法。

我的第一个尝试是两个目标 - 一个设置为链接并复制调试框架,另一个设置与发布框架相同。非常黑客,第二个目标的输出有不同的名称,每个目标仍然有原始问题。但是,我可以通过框架的单独配置构建获得相同的应用程序功能(Debug with Debug,Release with Release)。

然后我退回去思考这个问题,并意识到我只需要一个目录来容纳框架的链接和复制文件版本,但我需要根据配置不同地填充它。这让我想到了脚本,并且成功了。我最后添加了一个预操作运行脚本构建阶段来清除框架的任何旧副本并复制到正确的副本中。下面是一个名为Simple.framework的框架的脚本,其中DerivedData位置是Workspace-relative:

rm -R "${SRCROOT}/../Frameworks/Simple.framework"  
cp -R "${SRCROOT}/../DerivedData/TestTarget/Build/Products/${CONFIGURATION}/Simple.framework" "${SRCROOT}/../Frameworks/Simple.framework"  

因此,对于我上面概述的项目,我会为应用程序Build Phases中的每个框架设置一个类似的阶段。

答案 1 :(得分:2)

我通过你的想法制作了一个剧本。 您甚至无需更改DerivedData位置(设置为默认位置)。

  • 编辑方案...>构建(扩展)>后操作
  • 更改'将构建设置从'无'提供给' SCHEME_NAME '
  • 下面的粘贴命令

    if [ -n "${SRCROOT}" ] && [ -n "${FULL_PRODUCT_NAME}" ] && [ -d "${SRCROOT}/../Frameworks/${FULL_PRODUCT_NAME}" ]; then rm -rf "${SRCROOT}/../Frameworks/${FULL_PRODUCT_NAME}"; fi if [ -n "${BUILT_PRODUCTS_DIR}" ] && [ -n "${SRCROOT}" ] && [ -n "${FULL_PRODUCT_NAME}" ]; then cp -aR "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}" "${SRCROOT}/../Frameworks/"; fi

  • close&享受