从脚本添加文件到Xcode项目?

时间:2009-09-03 03:51:36

标签: xcode scripting project

现在我正在使用一些脚本来生成我在Xcode中作为资源包含的文件。问题是我正在运行脚本,然后从项目中删除,然后重新添加到项目中。必须有一种方法可以自动完成最后一步,这样脚本就可以生成文件并自动将它们添加到xcode项目中。

我正在使用bash,但任何语言示例都会有所帮助。

谢谢, 安德鲁

8 个答案:

答案 0 :(得分:34)

我和安德鲁有类似的需求。我需要能够在不知道这些资源的情况下从脚本中包含资源。这是我提出的解决方案:

在“复制包资源”之后添加一个新的运行脚本构建阶段,其中包含以下命令:

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 plists存在于SomeDerivedResources目录中,因此我们需要将该文件排除在复制到我们的产品之外

| xargs -t -I {}

find的结果导入xargs -t(将结果命令发送到stderr,以便它们显示在我们的构建日志中),-I(运行命令一次)对于每个输入文件)并使用{}作为我们的参数占位符

cp {} ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/

最后,将每个找到的文件(由{}表示)复制到我们产品的资源目录。

我在输入时意识到使用rsync设置而不是cp可能会阻止我们在每次构建时复制资源。如果您的资源非常庞大,可能值得一试。

(另外,由于一些原因,文件夹引用不适用于我的需要。一,我的图标在我的DerivedResources目录中并且将它们放在包中的子目录中似乎不起作用。另外,我理想地想要能够使用[UIImage imageNamed:@"MyAwesomeHappyImage.png"]-pathForResource:ofType:(我的一些文件在DerivedResources目录中进一步嵌套)。如果您的需求不包含这些限制,我高度建议你去文件夹参考路线。)

答案 1 :(得分:33)

这可以通过向您的应用程序添加新的构建阶段来完成。

  1. 在您的Xcode项目浏览器中,找到您的应用程序的目标,并展开它以显示所有构建阶段。

  2. 向目标添加新的"run script" build phase。最简单的方法是右键单击目标并选择“添加/新建构阶段/新建运行脚本构建阶段”

  3. 添加新构建阶段应该会打开一个检查器窗口。在此窗口中,您可以输入整个shell脚本,或只是输入命令行来运行脚本。

  4. 以下是黄金:在检查器窗口的底部,您可以指定输入文件和输出文件。指定输入文件会自动设置依赖项(只有在修改了某些输入文件时才会执行shell脚本)。指定输出文件会自动将依赖项传播到这些文件。运行shell脚本时,Xcode知道它需要处理shell脚本修改过的那些文件。

  5. 请务必将新构建阶段拖到阶段列表的顶部,如下面的屏幕截图所示。如果您需要将这些资源文件包含在捆绑包中,那么订单将非常重要。

  6. 保存,构建,提交到存储库,要求加薪,呼吸新鲜空气,度过愉快的一天! :)

答案 2 :(得分:11)

对于那些拥有大量文件的人,为了避免重新复制(或重新检查)每个文件,正如@Ben Cochran所建议的那样(非常感谢伟大的脚本),这是如何使用rsync实现的:

enter image description here

答案 3 :(得分:5)

如果您已经在系统的某个位置拥有相对于源根目录的文件,则可以随时添加a "Copy Files" phase。这将允许您指定应从中复制资源的目录。

您可以将此与已提供给您的构建脚本阶段答案结合使用。例如,运行一个脚本将您的资产从Subversion签出到项目的子目录中,然后使用从“$(SRCROOT)/ Assets”复制的“复制文件”阶段进行操作。

答案 4 :(得分:5)

  

基本上,只需要将文件复制到主包中

在这种情况下,只需向项目添加文件夹引用(在项目文件夹中创建一个文件夹,然后将其拖到项目“资源”组中(在“文件和组”列表中;然后在出现的工作表中)选择“为任何添加的文件夹创建文件夹引用”单选按钮),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.");
}

`

答案 5 :(得分:2)

我知道这有点晚了,但我刚刚遇到this article解释如何做一些听起来像你正在寻找的事情。

答案 6 :(得分:0)

我发现使用离子电容器也遇到类似的情况。我期望的是将文件包含在“复制捆绑资源”捆绑阶段中。我发现,Ionic已经为您打包了一些内含物,如果您沿着该文件夹滑动文件,也将其包含在内。

enter image description here

您看到包含App文件夹了吗?这是我们的切入点。

要添加该脚本,请添加一个执行以下操作的脚本:

cp -Rf ./includes/yourfolder/ ./ios/App/App/

答案 7 :(得分:0)

我设法解决了这个问题

<块引用>

“代码对象根本没有签名”

以这种方式在构建上传到 iTunes Connect 期间可能会遇到的情况:

我没有包含捆绑资源的脚本。

因此脚本(在本例中为 Python 文件)在构建期间执行,(它执行它必须做的事情)但它不包含在应用程序包中。

怎么办?

打开构建阶段,转到复制捆绑资源部分,选择文件并使用 (-) 将其删除。