我有一些我只需要运行模拟器的大型资源 - 我想让它们自动从所有设备构建中排除。有没有办法用Xcode 4来复制资源的自定义构建脚本?
答案 0 :(得分:7)
我选择了Run Script阶段,其中包含以下内容:
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
答案 1 :(得分:2)
目标决定了产品中包含的内容。复制目标并为其创建方案。修改该目标的成员资格。
答案 2 :(得分:0)
自定义构建脚本是您在Xcode中最好的朋友。让脚本在构建之后和代码签名之前删除资源。
答案 3 :(得分:0)
艺术的答案很好。
我添加此替代答案是因为我有某些要求,并且找到了解决这些问题的解决方案。
就我而言,我需要一些 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通信数据。这些数据绝不是核心应用程序的一部分,因此我不希望它随应用程序本身或默认情况下作为项目的一部分签入。