我有一个iOS应用程序,它将“Framework A”作为子项目,并将其作为目标依赖项包含在内。 “框架A”具有“框架B”具有子项目并将其包括为目标依赖项。最后,“框架B”将“框架C”作为子项目并将其作为目标依赖项包含在内。
此项目构建良好,可在模拟器中完美运行,但会立即出现错误dyld: Library not loaded: @rpath/Framework A.framework/Framework A
。
问题是“Framework A.framework”文件不会自动复制到应用程序的可执行文件中。您可以向应用目标添加“复制文件”构建阶段,并指定“Framework A.framework”应嵌入到可执行文件中,但此解决方案不会扩展。您仍然缺少“Framework B.framework”和“Framework C.framework”。
例如,假设您有一个复杂的依赖结构,如问题What is the correct process for linking static libraries that have common static libraries?中所述。您必须手动将六个框架嵌入到可执行文件中,如果根框架添加了更多依赖项,则项目将不再构建。您必须记住手动嵌入任何新的依赖项。
所以有人知道Xcode是否有办法自动嵌入你的目标依赖框架(就像它对静态库一样)或为什么Apple不这样做?特别是对于iOS来说,让Xcode构建框架到构建目录并且对它们完全没有任何意义似乎毫无意义。
答案 0 :(得分:1)
我找不到让Xcode自动执行此操作的方法。最后,我更新了编写我作为后期构建阶段添加的脚本
frameworksDirectory=${CONFIGURATION_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Frameworks
mkdir -p "${frameworksDirectory}"
for framework in "${CONFIGURATION_BUILD_DIR}"/*.framework
do
if [ -d "${framework}" ]; then
cp -r "${framework}" "${frameworksDirectory}"
fi
done
for framework in "${CONFIGURATION_BUILD_DIR}/../Release${EFFECTIVE_PLATFORM_NAME}"/*.framework
do
if [ -d "${framework}" ]; then
cp -r "${framework}" "${frameworksDirectory}"
fi
done
答案 1 :(得分:-1)
如何自动复制框架的简短答案是使用依赖项管理器。需要依赖关系管理器才能正确执行。唯一的另一个答案是避免多级依赖(这通常是首选,但并非总是可行)。
您的脚本仅适用于仅构建每个框架的一个版本的情况。它不会检测正在构建的同一框架的多个版本的情况,并且如果发生这种情况,可能会导致未定义的行为而不发出警告。您可能对构建系统有一定的了解,知道没有冲突的子框架,但Xcode没有。证明没有冲突意味着建立一个依赖管理器。
在我看来,对依赖管理器的需求是框架过于复杂使用的标志。但有些情况下它很有用。
你不应该只是复制一切并希望它有效(这是Xcode没有的一个原因)。在我看来,现在最好的依赖管理器是Carthage。目前最受欢迎的依赖管理器是CocoaPods。
有关此问题更专业版的更多讨论,请参阅Why are umbrella frameworks discouraged?。