有条件地构建具有不同资产目录的应用程序
Conditionally build app with different asset catalogs
我的 Xcode 项目以具有多种配置的方式设置,允许我为我的应用程序的不同变体使用相同的代码库,但每个都有独特的元素,例如应用程序名称、版本、包标识符、图标、启动屏幕等。为了完成大部分设置,我关注了这个网站:
http://appfoundry.be/blog/2014/07/04/Xcode-Env-Configuration/
我还有一个 config.plist 包含与每个 Xcode 配置关联的各种独特设置,只有在构建时才能成功复制。这是 运行 脚本构建阶段的片段,以便执行此操作:
RESOURCE_PATH=${SRCROOT}/${PRODUCT_NAME}/config/${CONFIGURATION}
BUILD_APP_DIR=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
echo "Copying all files under ${RESOURCE_PATH} to ${BUILD_APP_DIR}"
cp -v "${RESOURCE_PATH}/"* "${BUILD_APP_DIR}/"
我的下一个目标是能够在构建时复制特定配置的资产目录,以避免将所有不同配置的图像捆绑到构建中,导致它变得臃肿。我已经使用 运行 脚本尝试了与上面相同的解决方案,更改复制行以包含递归选项(因为资产目录本质上是一个目录):
cp -rv "${RESOURCE_PATH}/"* "${BUILD_APP_DIR}/"
但是,当我执行此操作时,我的应用无法构建,并提示无法找到应用图标和启动图像。有什么想法吗?
您可以通过以下方式完成这项工作:
- 为每个配置添加一个单独的资产目录,就像您通常将资产目录添加到您的项目一样。让我们假设在这个例子中我们称这些目录为 MediaForDebug.xcassets、MediaForAdHoc.xcassets 和 MediaForRelease.xcassets
- 确保新创建的资产目录都是你的目标成员(所以不要在这里排除它们,我们稍后会这样做)
- 现在,如果尚未添加到您的构建设置,请添加自定义
EXCLUDED_SOURCE_FILE_NAMES
用户定义设置。
- 请参阅下面的屏幕截图,了解要为此用户定义的设置设置的值。
通过这样做,Xcode 将只编译适当的资产目录,而忽略其他的。我已经在我们的一个项目中对此进行了测试,它按预期工作。
祝你好运!
备注:如果您使用的是 CocoaPods,您可能 运行 会遇到麻烦,因为 CocoaPods 添加了它自己的构建步骤来将您的资产和您的依赖项编译到 .car 文件中。有关此问题的讨论,请参阅 https://github.com/CocoaPods/CocoaPods/issues/1546。 TL;DR:确保此步骤不会在您的构建阶段执行,或者编辑它们执行的 CocoaPods 脚本以不进行资产构建。
2019 年 1 月 19 日更新:使用最新的稳定版 Xcode (10.1) 和 Cocoapods (v1.5.3),它们可以使用上述解决方案开箱即用。无需更改 Cocoapods 脚本或构建步骤,只需按照说明设置 EXCLUDED_SOURCE_FILE_NAMES
。
我的 Xcode 项目以具有多种配置的方式设置,允许我为我的应用程序的不同变体使用相同的代码库,但每个都有独特的元素,例如应用程序名称、版本、包标识符、图标、启动屏幕等。为了完成大部分设置,我关注了这个网站: http://appfoundry.be/blog/2014/07/04/Xcode-Env-Configuration/
我还有一个 config.plist 包含与每个 Xcode 配置关联的各种独特设置,只有在构建时才能成功复制。这是 运行 脚本构建阶段的片段,以便执行此操作:
RESOURCE_PATH=${SRCROOT}/${PRODUCT_NAME}/config/${CONFIGURATION}
BUILD_APP_DIR=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
echo "Copying all files under ${RESOURCE_PATH} to ${BUILD_APP_DIR}"
cp -v "${RESOURCE_PATH}/"* "${BUILD_APP_DIR}/"
我的下一个目标是能够在构建时复制特定配置的资产目录,以避免将所有不同配置的图像捆绑到构建中,导致它变得臃肿。我已经使用 运行 脚本尝试了与上面相同的解决方案,更改复制行以包含递归选项(因为资产目录本质上是一个目录):
cp -rv "${RESOURCE_PATH}/"* "${BUILD_APP_DIR}/"
但是,当我执行此操作时,我的应用无法构建,并提示无法找到应用图标和启动图像。有什么想法吗?
您可以通过以下方式完成这项工作:
- 为每个配置添加一个单独的资产目录,就像您通常将资产目录添加到您的项目一样。让我们假设在这个例子中我们称这些目录为 MediaForDebug.xcassets、MediaForAdHoc.xcassets 和 MediaForRelease.xcassets
- 确保新创建的资产目录都是你的目标成员(所以不要在这里排除它们,我们稍后会这样做)
- 现在,如果尚未添加到您的构建设置,请添加自定义
EXCLUDED_SOURCE_FILE_NAMES
用户定义设置。 - 请参阅下面的屏幕截图,了解要为此用户定义的设置设置的值。
通过这样做,Xcode 将只编译适当的资产目录,而忽略其他的。我已经在我们的一个项目中对此进行了测试,它按预期工作。
祝你好运!
备注:如果您使用的是 CocoaPods,您可能 运行 会遇到麻烦,因为 CocoaPods 添加了它自己的构建步骤来将您的资产和您的依赖项编译到 .car 文件中。有关此问题的讨论,请参阅 https://github.com/CocoaPods/CocoaPods/issues/1546。 TL;DR:确保此步骤不会在您的构建阶段执行,或者编辑它们执行的 CocoaPods 脚本以不进行资产构建。
2019 年 1 月 19 日更新:使用最新的稳定版 Xcode (10.1) 和 Cocoapods (v1.5.3),它们可以使用上述解决方案开箱即用。无需更改 Cocoapods 脚本或构建步骤,只需按照说明设置 EXCLUDED_SOURCE_FILE_NAMES
。