Ios 有条件地使用不同的资产目录构建应用程序

Ios 有条件地使用不同的资产目录构建应用程序,ios,xcode,xcodebuild,Ios,Xcode,Xcodebuild,我的Xcode项目是以一种具有多种配置的方式设置的,允许我对我的应用程序的不同变体使用相同的代码库,但每个应用程序中都有独特的元素,如应用程序名称、版本、捆绑标识、图标、启动屏幕等。为了完成大部分设置,我访问了这个网站: 我还有一个config.plist,其中包含与每个Xcode配置相关联的各种唯一设置,这些配置只有在构建时才能成功复制。以下是运行脚本构建阶段的一个片段,以实现此目的: RESOURCE_PATH=${SRCROOT}/${PRODUCT_NAME}/config/${CON

我的Xcode项目是以一种具有多种配置的方式设置的,允许我对我的应用程序的不同变体使用相同的代码库,但每个应用程序中都有独特的元素,如应用程序名称、版本、捆绑标识、图标、启动屏幕等。为了完成大部分设置,我访问了这个网站:

我还有一个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}/"
我的下一个目标是能够在构建时复制特定配置的资产目录,以避免将所有不同配置的映像捆绑到构建中,从而导致构建变得臃肿。我在运行脚本中尝试了与上面相同的解决方案,将复制行更改为包含递归选项(因为资产目录本质上是一个目录):


但是,当我这样做时,我的应用程序无法构建,并表示无法找到应用程序图标和启动图像。有什么想法吗?

这就是你可以做的,让这项工作顺利进行:


  • 为每个配置添加单独的资产目录,就像通常向项目添加资产目录一样。让我们假设在本例中,我们将这些目录称为MediaForDebug.xcsets、mediafordhoc.xcsets和MediaForRelease.xcsets
  • 确保新创建的资产目录都是目标的成员(因此不要在此处排除它们,我们稍后会这样做)
  • 现在,如果尚未添加到生成设置中,请添加自定义的
    EXCLUDED\u SOURCE\u FILE\u name
    用户定义设置
  • 有关此用户定义设置的值,请参见下面的屏幕截图

通过这样做,Xcode将只编译适当的资产目录,而忽略其他资产目录。我已经在我们的一个项目上测试过了,它按预期工作

祝你好运

备注:如果您使用CocoaPods,您可能会遇到麻烦,因为CocoaPods添加了自己的构建步骤来编译您的资产,并将依赖项的资产编译到on.car文件中。有关此问题的讨论,请参见。TL;DR:确保此步骤不在构建阶段执行,或者编辑他们执行的CocoaPods脚本以不进行资产构建


2019年1月19日更新:使用最新的稳定Xcode(10.1)和Cocoapods(v1.5.3),他们可以使用上述解决方案开箱即用。无需更改Cocoapods脚本或构建步骤,只需按说明设置
EXCLUDED\u SOURCE\u FILE\u name

这是您可以完成的工作:


  • 为每个配置添加单独的资产目录,就像通常向项目添加资产目录一样。让我们假设在本例中,我们将这些目录称为MediaForDebug.xcsets、mediafordhoc.xcsets和MediaForRelease.xcsets
  • 确保新创建的资产目录都是目标的成员(因此不要在此处排除它们,我们稍后会这样做)
  • 现在,如果尚未添加到生成设置中,请添加自定义的
    EXCLUDED\u SOURCE\u FILE\u name
    用户定义设置
  • 有关此用户定义设置的值,请参见下面的屏幕截图

通过这样做,Xcode将只编译适当的资产目录,而忽略其他资产目录。我已经在我们的一个项目上测试过了,它按预期工作

祝你好运

备注:如果您使用CocoaPods,您可能会遇到麻烦,因为CocoaPods添加了自己的构建步骤来编译您的资产,并将依赖项的资产编译到on.car文件中。有关此问题的讨论,请参见。TL;DR:确保此步骤不在构建阶段执行,或者编辑他们执行的CocoaPods脚本以不进行资产构建


2019年1月19日更新:使用最新的稳定Xcode(10.1)和Cocoapods(v1.5.3),他们可以使用上述解决方案开箱即用。无需更改Cocoapods脚本或构建步骤,只需按说明设置
排除的\u源文件\u名称。

您可以设置一个示例项目来尝试这样做吗?我考虑了一些问题,但这完全取决于您如何在项目中设置资产目录。我很乐意帮忙,这是一个非常有趣的主意!与此同时,我一直在调查。我可能弄错了,但如果我查看我的内置软件包,我只会看到正确的应用程序图标,而不会看到其他图标。看起来你的问题实际上是由xcode机械学在引擎盖下修复的。你能核实一下吗?很抱歉这么久才回复。创建一个示例项目有点困难。不知道你的意思是什么,Xcode实际上解决了我的问题。你能解释一下吗?它无法构建,无法找到我的启动屏幕和图标。基本上,我有一个名为images.xcaste的资产目录,用于配置文件夹下的每个配置。它像config.plist一样被复制。我应该提到,我必须取消选中images.xcaste的目标成员身份,就像config.plist一样。我怀疑这就是为什么我尝试构建应用程序时Xcode找不到它的原因。听起来你真正想要的是一个有多个目标的项目。这是一个非常有用的描述如何工作。有多个目标允许您指定每个资产目录所包含的目标、有多个.plist文件等。您可以设置一个示例项目,尝试在其中执行此操作吗?我考虑了一些问题,但这完全取决于您如何在项目中设置资产目录。我很乐意帮忙,这是一个非常有趣的主意!与此同时,我一直在调查。我可能弄错了,但如果我查看我的内置软件包,我只会看到正确的应用程序图标,而不会看到其他图标。看起来你的问题实际上是由xcode机械学在引擎盖下修复的。你能核实一下吗?很抱歉这么久才回复。创建一个示例项目有点困难。不知道你的意思是什么,Xcode实际上解决了我的问题。
cp -rv "${RESOURCE_PATH}/"* "${BUILD_APP_DIR}/"