在 Xcode 中复制目标时,是否有任何方法可以在创建之前或在创建时设置目标的名称?

35
在Xcode中复制目标是创建多个应用程序或框架/库产品的好方法,这些产品具有略有不同的功能,使用相同的代码库,因为受目标构建设置或相关方案控制的环境变量的条件代码的结果。首先复制您已知工作的基本版本,然后设置每个目标将使用的环境变量,然后开始使用内联预处理器#ifdef语句分割您的代码行为。
但是,任何复制的目标都将命名为“Original Target Name copy”。这可以重命名,但是info.plist也将具有此名称,它还可能出现在几个必要的构建设置中,根据您的操作方式,删除所有对复制目标名称非信息性“copy”版本的引用可能是一个繁琐和容易出错的过程。当我创建iOS框架时,似乎特别容易引入问题。
我的问题是是否有一种复制目标的技术,允许您在复制时指定新目标名称,以便永远没有临时错误的目标名称或包含该临时错误名称的文件被创建。或者,如果有一些方式可以使用“重构”功能以自动化方式修复此问题。
如果问题中包含某种错误假设,解释了为什么此功能未包含在Xcode中,请告诉我。我正在使用4.3。

5
那个还没有成功,对吧? - phi
2
真遗憾没有人知道如何做到这一点... - Nir Golan
1
一年多过去了,我在Xcode5中遇到了这个问题,我不明白为什么苹果不能解决这个问题! - meda
5个回答

6

很不幸,我相当确定目前没有任何用户界面可用于此操作,尽管我强烈认为这将是一个巨大的改进;我不能代表所有人,但我基本上从不想要一个名为Foo copy的目标。我建议提交一个 Radar


1
由于唯一的具体技术解决方案是使用CMake,这很有趣和信息丰富,但对于许多开发人员来说可能不切实际,并且在自定义生成的构建系统与Xcode的不断变化的实现之间存在脆弱的方面。因此,我将其标记为最佳答案,希望这能鼓励更多关于此问题的反馈。 - Halle

0

你可以尝试使用CMake来实现这个目标。它是一个构建系统生成器。

一开始学习和设置项目可能会有些困难,而且有些事情(比如资源添加)在Xcode中(目前)不容易实现,但是使用CMake可以使得创建新的目标非常容易。

基本上,你需要在源代码树中编写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中支持不太好。

+1 我不知道 CMake 可以生成 Xcode 项目!关于第三步--在 Xcode 不关闭项目和/或退出的情况下更改项目文件可能会导致奇怪、难以诊断的错误行为。我总是建议至少关闭项目,并尽量退出 Xcode,以减少痛苦。 - ipmcc
是的,你可能是对的,最好不要盲目相信XCode :)。但至少我还没有遇到在后台进行“实时”cmake重新运行时出现问题的情况。 - ecreif
抱歉,我不想泼你的冷水,但是从你的描述来看,“一些努力”加上“某些事情目前无法通过CMake很好地支持”,再加上“有时需要研究才能让事情正常工作”的说法,听起来比我试图避免的繁琐、容易出错的步骤还要费力。我很难相信我必须花费的时间和精力去学习CMake并进行设置,否则不如用我已经掌握的方法手动完成,因为我并不经常这样做。 - john.k.doe
我给你提供了一种比你的方法更快的复制方式,只需复制这些行,给你的目标对象起个名字,然后你就完成了克隆。我不知道你的项目复杂度如何,如果很简单或者它不需要经常修改,那么使用CMake进行一次设置可以节省你的时间。我发现它非常容易学习。但我能理解你,直到你真正开始受益之前,你必须经常复制你的目标对象。"有时候必要的研究"和不支持的功能取决于你有多么深入地去研究特殊的XCode事物。对于大部分的这些事情,都有解决方法。 - ecreif

-1
在Xcode 6中(之前的版本不确定),复制一个目标仍然会生成“copy”附加并重命名所有本地化菜单。但是,可以通过在Build Settings / All中更新Packaging下的Product Name来撤消此操作。但是,Info.plist仍然需要处理,以及方案命名。

-3

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


-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仅应是您新目标的一部分。可能还有许多其他类似的文件(图标、启动画面、其他图形等)。

就像发布这个答案的人既没有读原始作者发布的问题的标题和内容,也没有看到赏金细节中关于寻找一种或两种步骤完成此操作的要求。作者描述的解决方案和我一直在使用的解决方案……现在都比这个方法少了几步。这比我们已经在做的更糟,而不是更好。 - john.k.doe
这个解决方案似乎没有考虑到我在project.pbxproj中通常遇到的所有旧名称的引用。 - Halle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接