35

在 Xcode 中复制一个目标是创建多个应用程序或框架/库产品的好方法,这些产品使用相同的代码库具有不同的功能,这是由目标构建设置或相关方案中设置的环境变量控制的条件代码的结果。首先复制您已知的工作基本版本,然后设置每个目标将使用的环境变量,然后开始使用内联预处理器#ifdef 语句拆分您的代码行为。

但是,任何重复的目标都将被命名为“原始目标名称副本”。这可以重命名,但 info.plist 也会有这个名称,它也可能出现在几个基本的构建设置中,并且删除对非信息性“副本”的所有引用可能是一个乏味且引入错误的过程" 重复目标名称的版本,具体取决于您的操作方式。当我创建 iOS 框架时,这似乎特别容易引入问题。

我的问题是是否有任何复制目标的技术允许您在复制时指定新的目标名称,因此永远不会出现临时错误的目标名称或创建包含该临时错误名称的任何文件。或者,或者,如果有某种方法可以使用“重构”功能来解决这个问题,这是一种自动化的方法。

如果问题中包含某种错误假设来解释为什么此功能未包含在 Xcode 中,请告诉我。我正在使用4.3。

4

5 回答 5

6

不幸的是,我非常确定没有任何当前的 UI,尽管我强烈同意这将是一个巨大的改进;我不能代表所有人,但我几乎从不想要一个名为Foo copy的目标。我建议提交一个 Radar

于 2013-02-14T13:17:50.917 回答
0

您可以通过一些努力使用CMake。它是一个构建系统生成器。

一开始学习和设置项目可能很困难,有些事情(目前)对于 Xcode 来说是不容易的(比如资源添加),但它会使使用基本配置创建新目标变得非常容易。

基本上,您在源代码树中编写CMakeLists.txt文件以定义您的库和目标,然后定义源文件等,然后每次生成 Xcode 项目。

添加新目标将非常容易:

  1. ADD_EXECUTABLE( Target_Name Source_Files )
  2. SET_TARGET_PROPERTIES( Target_Name PROPERTIES COMPILE_DEFINITIONS Your_Additional_Defines )
  3. 重新运行 CMake。(甚至不需要关闭 Xcode 项目)

缺点:

  • 需要时间来设置。
  • 有时需要研究才能使某些事情发挥作用
  • CMake 目前无法很好地支持某些内容
于 2013-02-13T16:57:17.227 回答
-1

例如,在 Xcode 6(不确定早期版本)中,复制目标仍会生成“复制”附件并重命名所有本地化菜单。但是,通过在 Build Settings / All 中的 Packaging 下更新 Product Name 是可逆的。不过,Info.plist 和 Scheme 命名仍然需要注意。

于 2015-06-10T18:05:30.820 回答
-3

双击目标以至少重命名目标......仍在寻找重命名产品,但如果您可以重命名其他所有内容(如显示名称等),这并不重要)

于 2013-11-25T15:18:47.117 回答
-4
  • 在导航器面板中选择项目
  • 选择要复制的目标
  • 鼠标右键单击并选择“复制”
  • 在 XCode 中重命名目标:单击选定的目标并开始内联编辑。
  • 打开终端并转到您的项目目录/文件夹
  • 运行 svn status 以查看 XCode 刚刚所做的更改。
  • XCode 已经创建了新的 Infocopy.plist 文件,并且如果你使用一个,它已经添加到版本控制之下。通常您要选择不同的名称,因此请按照下列步骤操作:
  • 取消版本控制添加:$> svn revert Infocopy.plist
  • 重命名它: $> mv Infocopy.plist YourNameInfo.plist
  • 将其添加到版本控制: $> svn add YourNameInfo.plist
  • 在名为“Info.plist 文件”的新目标构建设置中设置新名称
  • 正确重命名目标文件: $> mv OrigTargetCopy.xcscheme YourTargetName.xcscheme
  • 在版本控制下添加新的目标文件: $> svn add YourTargetName.xcscheme
  • 在名为“产品名称”的新目标构建设置中重命名您的产品
  • 很可能您还想为您的新目标设置新的“预处理器宏”构建设置。
  • 设置正确的值 YourNameInfo.plist
  • 为目标特定文件设置目标分配。通常 YourNameInfo.plist 应该只是你新目标的一部分。可能还有很多其他类似的文件(图标、启动画面、其他图形等)。
于 2013-02-07T23:34:15.047 回答