构建配置和目标之间有什么区别?
What's the difference between Build Configurations and Targets?
我们有五个几乎相同的应用程序,有一些不同 icons/names/settings。它们是同一个应用程序的不同 "brands",仅在几个不同的图标、单独的应用程序组和代码中的一些默认设置上有所区别。这些在 Xcode 中创建为自己的 目标 。它是 一个 代码库,但有 5 个目标指向它。
一开始看起来非常不错,有五个不同的目标。但是,我们现在已经向该应用程序添加了两个扩展。一个自定义 "NotificationContentExtension",和一个 "TodayExtension"(Widget)。由于我们有 5 个不同的目标和 5 个不同的 entitlements/groups,我们发现除了将这些扩展添加到每个目标之外别无他法。由于扩展是另一个目标,这意味着我们现在有 15 个不同的目标。
我们现在的编译时间非常慢,因为每次我们打开情节提要时,Xcode 都会为每个(主要)目标编译一次整个内容。我不需要构建故事板 5 次。或者我的任何其他文件。我有一个应用程序,但有几个不同的文件和一些运行时设置。
这让我感到奇怪——这 15 个目标中的每一个都默认有两个构建配置:RELEASE 和 DEBUG。我注意到可以自定义这些并添加更多。为什么不添加配置而不是目标?
例如,将 "RELEASE" 和 "DEBUG" 改为 "MYAPP1"、"MYAPP2"、"MYAPP3" 等。每个配置都可以有自己的产品名称,图标等等,对吧?
有什么好的理由不这样做吗?在处理不同的 AppGroups/Entitlements 等时是否可能?我们将 CoreData 数据库存储在 AppGroups 中。重要的是,这些应用程序可以全部安装在同一台设备上而不会相互损坏。
据我所知,这应该不是问题,只要每个配置都有几个不同的 FLAG,并自定义代码即可。
签约呢?
我阅读了关于该主题的 this article/tutorial,它解释了基础知识并让我开始了,但要使用数据库和权利等进行实际测试将需要大量工作。
几年后回答:顺便说一句,答案是肯定的。使用 BuildConfigurations 是安全的并且工作得很好。它还删除了所有不必要的构建时间。我们转换了项目设置并最终得到了三个目标(app、widget1、widget2)和多个 BuildConfigurations。
要自定义构建配置,请在项目导航器中单击您的项目,然后单击蓝色的“MyApp”(在项目下,而不是在目标下),然后在顶部栏中单击 select“信息”。您会看到您的配置列表。默认情况下,它们将是“DEBUG”和“RELEASE”。你可以在这里add/remove/customize。将其设为“MyApp1”、“MyApp2”和“MyApp3”。然后单击“目标”下的“MyApp”,转到“构建设置”,然后搜索例如“产品名称”。如果将鼠标悬停在它上面,“产品名称”旁边会出现一个箭头,单击它展开它,然后您会看到您可以针对不同的配置单独更改该值,因此“MyApp3”可以命名为“MyApp3”而无需影响他人。
这可以为所有构建设置完成。
如果您有多个“风格”,并且以后可能需要添加更多,我建议不要直接在“构建设置”中更改各个值,因为它们更难找到且更容易忘记。您应该让每个相关值(例如 ProductName)继承自外部键,并为每个“风味”创建您自己的 .xcconfig-files,其中包含这些键的所有单独值。这样,如果您需要添加另一种风格,您可以简单地添加另一个 .xcconfig-file ,它具有所有相关更改,并且您不必查看 BuildSettings 中的所有值并可能忘记其中的一些值。
完成此操作后,为了能够实际 build/run 每个配置,您必须为每个配置添加一个方案。
我从这种方法中注意到的唯一负面影响是 scheme-dropdown-list 中的应用程序图标是错误的。它们都是一样的,即使“App Icon Set Name”不同。 run/installed时应用程序的图标是正确的,但在Xcode的built-in drop-down-list.
中显示错误
不过要小心,您应该知道在更改 build-settings 时您在做什么。默认情况下,当您 运行 一个应用程序时, DEBUG-config 运行s 和 RELEASE 用于“存档”(发布时)。如果您不尊重这两者之间的差异,而只是为每个 apps/flavors 创建一个构建配置,那么您要么在开发时变得更长 build-times,要么在发布后性能变差。这取决于“优化级别”等构建设置。因此,为了安全起见,您应该为每个应用创建“MyApp1DEBUG”和“MyApp1Release”,它们分别是原始“DEBUG”和“RELEASE”的克隆。
我们有五个几乎相同的应用程序,有一些不同 icons/names/settings。它们是同一个应用程序的不同 "brands",仅在几个不同的图标、单独的应用程序组和代码中的一些默认设置上有所区别。这些在 Xcode 中创建为自己的 目标 。它是 一个 代码库,但有 5 个目标指向它。
一开始看起来非常不错,有五个不同的目标。但是,我们现在已经向该应用程序添加了两个扩展。一个自定义 "NotificationContentExtension",和一个 "TodayExtension"(Widget)。由于我们有 5 个不同的目标和 5 个不同的 entitlements/groups,我们发现除了将这些扩展添加到每个目标之外别无他法。由于扩展是另一个目标,这意味着我们现在有 15 个不同的目标。
我们现在的编译时间非常慢,因为每次我们打开情节提要时,Xcode 都会为每个(主要)目标编译一次整个内容。我不需要构建故事板 5 次。或者我的任何其他文件。我有一个应用程序,但有几个不同的文件和一些运行时设置。
这让我感到奇怪——这 15 个目标中的每一个都默认有两个构建配置:RELEASE 和 DEBUG。我注意到可以自定义这些并添加更多。为什么不添加配置而不是目标?
例如,将 "RELEASE" 和 "DEBUG" 改为 "MYAPP1"、"MYAPP2"、"MYAPP3" 等。每个配置都可以有自己的产品名称,图标等等,对吧?
有什么好的理由不这样做吗?在处理不同的 AppGroups/Entitlements 等时是否可能?我们将 CoreData 数据库存储在 AppGroups 中。重要的是,这些应用程序可以全部安装在同一台设备上而不会相互损坏。 据我所知,这应该不是问题,只要每个配置都有几个不同的 FLAG,并自定义代码即可。 签约呢?
我阅读了关于该主题的 this article/tutorial,它解释了基础知识并让我开始了,但要使用数据库和权利等进行实际测试将需要大量工作。
几年后回答:顺便说一句,答案是肯定的。使用 BuildConfigurations 是安全的并且工作得很好。它还删除了所有不必要的构建时间。我们转换了项目设置并最终得到了三个目标(app、widget1、widget2)和多个 BuildConfigurations。
要自定义构建配置,请在项目导航器中单击您的项目,然后单击蓝色的“MyApp”(在项目下,而不是在目标下),然后在顶部栏中单击 select“信息”。您会看到您的配置列表。默认情况下,它们将是“DEBUG”和“RELEASE”。你可以在这里add/remove/customize。将其设为“MyApp1”、“MyApp2”和“MyApp3”。然后单击“目标”下的“MyApp”,转到“构建设置”,然后搜索例如“产品名称”。如果将鼠标悬停在它上面,“产品名称”旁边会出现一个箭头,单击它展开它,然后您会看到您可以针对不同的配置单独更改该值,因此“MyApp3”可以命名为“MyApp3”而无需影响他人。 这可以为所有构建设置完成。
如果您有多个“风格”,并且以后可能需要添加更多,我建议不要直接在“构建设置”中更改各个值,因为它们更难找到且更容易忘记。您应该让每个相关值(例如 ProductName)继承自外部键,并为每个“风味”创建您自己的 .xcconfig-files,其中包含这些键的所有单独值。这样,如果您需要添加另一种风格,您可以简单地添加另一个 .xcconfig-file ,它具有所有相关更改,并且您不必查看 BuildSettings 中的所有值并可能忘记其中的一些值。
完成此操作后,为了能够实际 build/run 每个配置,您必须为每个配置添加一个方案。
我从这种方法中注意到的唯一负面影响是 scheme-dropdown-list 中的应用程序图标是错误的。它们都是一样的,即使“App Icon Set Name”不同。 run/installed时应用程序的图标是正确的,但在Xcode的built-in drop-down-list.
中显示错误不过要小心,您应该知道在更改 build-settings 时您在做什么。默认情况下,当您 运行 一个应用程序时, DEBUG-config 运行s 和 RELEASE 用于“存档”(发布时)。如果您不尊重这两者之间的差异,而只是为每个 apps/flavors 创建一个构建配置,那么您要么在开发时变得更长 build-times,要么在发布后性能变差。这取决于“优化级别”等构建设置。因此,为了安全起见,您应该为每个应用创建“MyApp1DEBUG”和“MyApp1Release”,它们分别是原始“DEBUG”和“RELEASE”的克隆。