现在我正在使用一些脚本来生成我作为资源包含在 Xcode 中的文件。问题是我正在运行脚本,然后从项目中删除,然后重新添加到项目中。必须有一种方法可以自动化这最后一步,以便脚本可以生成文件并自动将它们添加到我的 xcode 项目中。
我正在使用 bash,但任何语言示例都会有所帮助。
谢谢,安德鲁
我和安德鲁有类似的需求。我需要能够在不提前知道这些资源的情况下从脚本中包含资源。这是我想出的解决方案:
在“复制捆绑资源”之后添加一个新的运行脚本构建阶段,其中包含以下命令:
find -L ${SRCROOT}/SomeDerivedResources \
-type f -not -name ".*" \
-not -name "`basename ${INFOPLIST_FILE}`" \
| xargs -t -I {} \
cp {} ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/
看起来很吓人,但让我们分解一下:
find -L ${SRCROOT}/SomeDerivedResources
这会爬取我们源根目录中的 SomeDerivedResources 目录(-L
告诉它遵循符号链接)
-type f
仅包含常规文件
-not -name ".*"
忽略以点开头的文件
-not -name "`basename ${INFOPLIST_FILE}`"
就我而言,我的 Info plist 位于我的 SomeDerivedResources 目录中,因此我们需要将该文件排除在复制到我们的产品之外
| xargs -t -I {}
将结果通过管道输入find
(将结果命令回显到 stderr,以便它们显示在我们的构建日志中),(为每个输入文件运行一次命令)并用作我们的参数占位符xargs
-t
-I
{}
cp {} ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/
最后,将找到的每个文件(用 表示{}
)复制到我们产品的资源目录中。
我在键入此内容时意识到,使用 rsync 设置而不是 cp 可能会阻止我们在每次构建时复制资源。如果您的资源非常大,则可能值得研究。
(此外,出于以下几个原因,文件夹引用无法满足我的需要。第一,我的图标位于我的 DerivedResources 目录中,并且将它们放在捆绑包中的子目录中似乎不起作用。此外,理想情况下,我希望能够使用[UIImage imageNamed:@"MyAwesomeHappyImage.png"]
and -pathForResource:ofType:
(并且我的一些文件进一步嵌套在我的 DerivedResources 目录中)。如果您的需求不包含这些限制,我强烈建议您使用文件夹参考路线。)
这可以通过向您的应用程序添加新的构建阶段来完成。
在您的 Xcode 项目浏览器中,找到您的应用程序的目标,然后展开它以显示所有构建阶段。
向您的目标添加一个新的“运行脚本”构建阶段。最简单的方法是右键单击目标并选择“Add/New Build Phase/New Run Script Build Phase”
添加新的构建阶段应该会打开一个检查器窗口。在这个窗口中,您可以输入整个 shell 脚本,或者只是一个命令行来运行脚本。
这是黄金:在检查器窗口的底部,您可以指定输入文件和输出文件。指定输入文件会自动设置依赖关系(只有在修改了某些输入文件时才会执行 shell 脚本)。指定输出文件会自动将依赖项传播到这些文件。当你的 shell 脚本运行时,Xcode 知道它需要处理那些被 shell 脚本修改过的文件。
请务必将您的新构建阶段拖到阶段列表的顶部,如下面的屏幕截图所示。如果您需要将这些资源文件包含在包中,则顺序将很重要。
保存、构建、提交到存储库、要求加薪、呼吸新鲜空气并度过美好的一天!:)
对于那些有大量文件的人,为了避免重新复制(或重新检查)每个文件,正如@Ben Cochran 所建议的(非常感谢伟大的脚本),这是使用 rsync 的方法:
基本上,只需将文件复制到主包中
在这种情况下,只需添加对项目的文件夹引用(在项目文件夹中创建一个文件夹,然后将其拖到项目的“资源”组中(在“文件和组”列表中;然后在出现的工作表中选择“创建任何添加的文件夹的文件夹引用”单选按钮)和 Xcode 将在构建时将文件夹及其所有内容复制到目标包中。
只是附加说明:如果您使用此方法添加图像子文件夹,则必须在图像名称前加上子文件夹名称才能使用“[UIImage imageNamed:]”。例如,如果您在名为“MyImages”的子文件夹中有一个名为“Rendezvous.png”的图像:
`
// this won't work
UIImage * image = [UIImage imageNamed:@"Rendezvous"];
if (image) {
NSLog(@"Found Rendezvous!");
} else {
NSLog(@"Didn't find Rendezvous.");
}
// but this will!
image = [UIImage imageNamed:@"MyImages/Rendezvous"];
if (image) {
NSLog(@"Found MyImages/Rendezvous!");
} else {
NSLog(@"Didn't find MyImages/Rendezvous.");
}
`
如果您的系统中某处已经有文件,相对于您的源根目录,您可以随时添加“复制文件”阶段。这将允许您指定应从中复制资源的目录。
您可以将此与已经提供给您的构建脚本阶段答案结合起来。例如,运行一个脚本,将您的资产从 Subversion 检出到项目的子目录中,然后执行从“$(SRCROOT)/Assets”复制的 Copy Files 阶段。
我知道这有点晚了,但我刚刚看到这篇文章,它解释了如何做一些听起来像你正在寻找的东西。
我设法解决了这个问题
“代码对象根本没有签名”
在构建上传到 iTunes Connect 的过程中可能会遇到这种情况:
我没有将脚本包含在捆绑资源中。
所以脚本(在这种情况下是 Python 文件)在构建期间执行,(它做它必须做的事情)但它不包含在应用程序的包中。
怎么做?
打开 Build Phases,转到 Copy Bundle Resources 部分,选择文件并使用 (-) 将其删除。