根据方案包括/排除资源
Posted
技术标签:
【中文标题】根据方案包括/排除资源【英文标题】:Include/exclude resources depending on scheme 【发布时间】:2011-04-14 18:41:41 【问题描述】:我有一些大型资源,我只需要运行我的模拟器——我希望它们自动从所有设备构建中排除。 Xcode 4 没有复制资源的自定义构建脚本,有什么方法可以做到这一点?
【问题讨论】:
【参考方案1】:我在运行脚本阶段进行了以下操作:
if [ $PLATFORM_NAME != "iphonesimulator" ]; then
echo "device build -- removing resources..."
rm "$TARGET_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/test_a.mp3"
rm "$TARGET_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/test_b.mp3"
# reveal the binary in the Finder
/usr/bin/open --reveal "$TARGET_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH"
else
echo "simulator build..."
fi
【讨论】:
不漂亮,但至少易于维护(与额外的目标相比)。【参考方案2】:目标决定了产品中包含的内容。复制您的目标并为其创建一个方案。修改该目标的成员资格。
【讨论】:
我试过这个,我想它有效。我不喜欢在项目级别而不是目标级别定义构建配置,因此您最终会为每个目标使用发布/调试/临时等,从而为您提供方案组合爆炸。【参考方案3】:自定义构建脚本是您在 Xcode 中最好的朋友。让脚本在构建之后和代码签名之前删除资源。
【讨论】:
可以举个例子吗?基本上我需要删除文件夹中的所有文件【参考方案4】:Art 的回答效果很好。
我添加此替代答案是因为我有某些要求,并且我找到了解决这些要求的解决方案。
在我的情况下,我需要一些 large 资源仅在某些测试版本中,但我不希望它们包含在项目中或与项目一起签入。我还想避免 Xcode 在构建过程中毫无意义地将一个大文件从一个文件夹复制到另一个文件夹。
我的解决方法如下:
在磁盘上的Resources/
文件夹下创建一个新文件夹,标题为FolderLinkedResources
。
将文件夹引用添加到 Xcode 项目中的此文件夹。 这是指向硬盘上实际文件夹的链接,而不是项目文件夹组。您可以通过“添加文件”对话框中的一个选项来完成:
然后在构建时我有一个自定义构建阶段脚本(放置在编译之前),hard-links 所需的资源文件到磁盘上的引用文件夹中:
# COPY_SPECIAL_RESOURCES is only defined in schemas where I require the special resource(s).
# SpecialResources folder is a sibling folder alongside my entire Xcode project folder
if [ $COPY_SPECIAL_RESOURCES == "1" ]; then
ln ../SpecialResources/mySpecialResourceFile.bin Resources/FolderLinkedResources/
fi
现在构建将包含您的特殊资源。
请注意,由于资源文件位于项目中的文件夹引用中,因此构建的应用程序实际上会将资源文件包含在文件夹中,而不是在顶层。这意味着检索您的资源的常规调用将不起作用:
NSString *resourcePath = [[NSBundle mainBundle]
pathForResource:@"mySpecialResourceFile"
ofType:@"bin"];
要解决此问题,您还需要提供包含资源的文件夹名称:
NSString *resourcePath = [[NSBundle mainBundle]
pathForResource:@"mySpecialResourceFile"
ofType:@"bin"
inDirectory:@"FolderLinkedResources"];
注意:当您在构建时才真正知道资源是什么时,这种技术也很有效!只要您的脚本步骤在文件中硬链接,它们就会进入构建。
为了整洁和理智,我在编译之后包含了一个运行脚本构建阶段,它清除了硬链接:
if [ $COPY_SPECIAL_RESOURCES == "1" ]; then
rm -rf Resources/FolderLinkedResources/*.*
fi
最后,如果有人对我的实际用例感兴趣:我已经为我的应用的某些离线测试版本预先记录了 HTTP 通信数据。这些数据绝不是核心应用程序的一部分,所以我不希望它与应用程序本身一起签入,或者默认情况下是项目的一部分。
【讨论】:
请注意,虽然我还没有完全研究它,但***.com/a/9220345/348476 的答案可能比我上面的答案更简单,因此更好。以上是关于根据方案包括/排除资源的主要内容,如果未能解决你的问题,请参考以下文章