从脚本添加文件到Xcode项目?
现在,我正在使用几个脚本来生成文件,我将其作为资源包含在Xcode中。 事情是我正在运行脚本,然后从项目中删除,然后添加回到项目。 必须有一种方法来实现最后一步的自动化,以便脚本可以生成文件并自动将它们添加到xcode项目中。
我使用bash,但任何语言的例子会有所帮助。
谢谢你,安德鲁
这可以通过添加一个新的构build阶段到您的应用程序。
-
在您的Xcode项目浏览器中,find您的应用程序的目标,并展开它以显示所有的构build阶段。
-
为您的目标添加一个新的“运行脚本”构build阶段 。 最简单的方法是右键单击目标并select“添加/新build生成阶段/新build运行脚本生成阶段”
-
添加新的构build阶段应该提出一个督察窗口。 在这个窗口中,你可以input整个shell脚本,或者简单地通过命令行来运行脚本。
-
这里是黄金:在巡视窗口的底部,你可以指定input文件和输出文件。 指定input文件会自动设置依赖关系(只有在某些input文件被修改的情况下才会执行shell脚本)。 指定输出文件会自动将依赖关系传播到这些文件。 当你的shell脚本运行时,Xcode知道它需要处理shell脚本修改过的那些文件。
-
确保将新的构build阶段拖到阶段列表的顶部,如下面的截图所示。 如果您需要将这些资源文件包含在软件包中,顺序将很重要。
-
保存,build立,提交到存储库,请求加薪,获得一些新鲜空气,祝你有美好的一天! 🙂
我和安德鲁有类似的需求。 我需要能够从脚本中包含资源,而不必事先知道这些资源。 以下是我提出的解决scheme:
在包含以下命令的“Copy Bundle Resource”之后添加一个新的Run Script构build阶段:
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}`"
在我的情况下,我的信息plists住在我的SomeDerivedResources目录,所以我们需要排除该文件被复制到我们的产品
| xargs -t -I {}
使用-t
(将生成的命令返回stderr,使其显示在我们的构build日志中),将xargs
的结果input到xargs
, -I
(对每个input文件运行一次命令),并使用{}
作为参数占位符
cp {} ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/
最后,将每个find的文件(以{}
表示)复制到我们产品的资源目录中。
我意识到,当input这个使用rsync设置而不是cp可以防止我们每次构build时都复制资源。 如果您的资源非常大,则可能值得查看。
(另外,由于几个原因,文件夹引用不起作用,我的图标位于我的DerivedResources目录中,并且将它们放在包中的一个子目录中似乎不起作用,而且我希望能够使用[UIImage imageNamed:@"MyAwesomeHappyImage.png"]
和-pathForResource:ofType:
我的一些文件嵌套在DerivedResources目录里面)如果你的需要不包含这些限制,我强烈build议你去文件夹参考路线。)
对于那些有大量文件的人来说,为了避免重复(或者重新检查)每个文件,正如@Ben Cochran(非常感谢伟大的脚本)所build议的那样,这是如何使用rsync来完成的:
如果您的系统上已有文件,则可以随时添加“复制文件”阶段 。 这将允许您指定资源从哪个目录复制。
您可以将此与已经提供给您的构build脚本阶段答案结合使用。 例如,运行一个脚本来检查你的资产从Subversion到你的项目的一个子目录中,然后用“$(SRCROOT)/ Assets”复制一个Copy Files阶段。
基本上,这些文件只需要被复制到主包中
在这种情况下,只需添加项目文件夹引用(在项目文件夹中创build一个文件夹,然后将其拖到项目“资源”组(在“文件和组”列表中;然后在出现的表中select“创build所有添加文件夹的文件夹引用“单选button),Xcode将在构build时将该文件夹及其所有内容复制到目标包中。
只是一个额外的注意事项:如果您使用此方法添加图像子文件夹,您必须在图像名称前加上子文件夹名称以使用'[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."); }
`
我知道这有点晚了,但是我刚刚遇到这篇文章,解释了如何做一些听起来像你正在寻找的东西。