在 Xcode 中复制目标时,有没有办法设置目标在创建之前或创建时的名称?

Posted

技术标签:

【中文标题】在 Xcode 中复制目标时,有没有办法设置目标在创建之前或创建时的名称?【英文标题】:When duplicating a target in Xcode, is there any way to set the name that the target will have before or as it is created? 【发布时间】:2012-05-07 07:41:43 【问题描述】:

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

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

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

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

【问题讨论】:

还没有运气,对吧? 很遗憾没有人知道该怎么做…… 一年多后,我刚刚在Xcode5中遇到了这个问题,我不明白为什么苹果不能解决这个问题! 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

添加新目标非常容易:

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

缺点:

设置需要时间。 有时需要研究才能使某些事情发挥作用 目前 CMake 无法很好地支持某些功能

【讨论】:

+1 我不知道 CMake 可以生成 Xcode 项目!回复:第 3 步——在 Xcode 背后更改项目文件(即不关闭项目和/或退出 Xcode)可能会导致奇怪的、难以诊断的错误行为。我总是建议至少关闭项目,并为了尽量减少痛苦,一起退出 Xcode。 是的,你可能是对的,最好不要盲目相信 XCode :)。但至少我在后台重新运行那些“实时”cmake 并没有遇到问题。 拍摄,我讨厌在这件事上做一个湿毯子,但是你描述这个的方式,你告诉我的“一些努力”我必须结合“有些事情目前不是通过 CMake 得到很好的支持”以及“有时需要研究才能让事情正常工作”听起来比我试图避免的乏味、容易出错的步骤更努力。我很难买到我必须投入的时间和精力来学习 CMake 并进行设置经常。 我给了你一种比你的方法复制速度更快的方法,只需复制行,给你的目标命名,然后你的目标就被克隆了。我不知道您的项目的复杂性,如果它很简单或者您不需要随着时间的推移对其进行太多更改,那么使用 CMake 的一次性设置可以为您节省时间。我发现它很容易学习。但我能理解你,你必须经常重复你的目标,直到你真正开始受益。 “有时需要研究”和不支持的功能取决于您对特殊 XCode 事物的“深入”程度。对于这些事情中的大多数,都有解决方法。【参考方案4】:

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

【讨论】:

因为作为具体技术解决方案的唯一答案是使用 CMake,这很有趣且内容丰富,但对许多开发人员来说可能不实用,并且可能在自定义生成的构建系统和Xcode 不断变化的实现,我将这个标记为最好的,希望它能鼓励更多的雷达。【参考方案5】: 在导航面板中选择项目 选择要复制的目标 单击鼠标右键并选择“复制” 在 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 应该只是你新目标的一部分。可能还有很多其他类似的文件(图标、启动画面、其他图形等)。

【讨论】:

就像发布此答案的人既没有阅读标题,也没有阅读原作者发布的问题的内容,也没有阅读关于寻找 1 或 2 步方式的赏金细节去做这个。作者描述的解决方案,以及我一直在使用的解决方案……都比现在采取的步骤更少。这比我们已经在做的更糟糕,而不是更好。 这个解决方案似乎没有考虑到我通常在 project.pbxproj 中遇到的对旧名称的所有引用。

以上是关于在 Xcode 中复制目标时,有没有办法设置目标在创建之前或创建时的名称?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode中构建规则中的“复制到目标”是啥?

xcode 中没有 iPhoneOS 目标

在 XCode 的一个目标中有两个 GoogleService-Info.plist

在 XCode 中更改项目和目标名称

重复的目标:Xcode 无法使用选定的目标运行

你如何在新的 XCode 中“升级 ipad 的目标”?