1

Xcode 包含一个灵活的构建规则系统。然而,文档几乎不存在。

我正在为 iOS 5 和 iOS 6 开发的一个项目包括一个 rtf 帮助文件。对于 iOS 6,我可以将 rtf 文件转换为存档的 NSAttributedString 对象,然后在运行时加载它并将其直接显示到 UITextView。对于 iOS 5,我不能(在 Core Text 中没有大量工作......)所以我只想要没有样式信息的文本。

我写了一个命令行工具,RTFToData,它接受一个 RTF 文件作为输入并生成一个 .txt 文件和一个 .data 文件(其中 .data 文件包含我的项目知道如何使用的样式文本的一个版本。)

这是我的命令行工具的语法:

RTFToData [-o] source_path [destination_path] -o(可选)覆盖现有文件 source_path(必需)源 RTF 文件的路径(必须具有扩展名“rtf”或“RTF”destination_directory(可选。)将输出文件写入源文件目录,如果没有指定的目标destination_directory 必须存在(如果指定)。

我想设置我的项目,以便我可以将 .rtf 文件添加为源(未选中“添加到目标”复选框。)我希望 Xcode 在每个文件上运行我的 RTFToData 命令,指定输出文件应该被复制到一个目录,然后添加到目标。

理想情况下,我希望构建过程了解我的源 .rtf 文件与已处理的 .data 和 .txt 文件之间的依赖关系。如果我触摸 .rtf 文件,我希望构建过程重新运行 rtftodata 命令。

我是 makefile 和 unix 脚本新手。我认为我可以使用运行脚本构建规则来执行此操作,但我不清楚如何。我想我需要编写一个脚本来查找“.rtf”类型的所有文件,将该文件列表通过管道传输到我的 RTFToData 调用中。

有人可以概述我需要在 Xcode IDE 中采取的步骤以使我的项目顺利处理吗?

作为旁注,是否有一些目录可以放置命令行工具,以便它们可用于当前版本的 Xcode?到目前为止,我一直在 /Library/usr/bin 中安装 RTFToData 命令,但我真的很希望将构建工具包含在项目中,或者至少不必使用 sudo 来设置每个开发用于构建此项目的机器。

4

1 回答 1

2

创建自定义构建阶段

  1. 将 .rtf 文件添加到您的项目中,并确保将它们添加到您的目标中。
  2. 转到您的目标设置并选择“构建规则”选项卡:

    在此处输入图像描述

  3. 单击底部的“添加构建规则”按钮。

    在此处输入图像描述

  4. 您想根据以下内容配置规则:

    在此处输入图像描述

    为要匹配的文件输入标准通配符 glob ( *.rtf)。

    在脚本部分中,您可以使用许多环境变量。假设您的 glob 与Test.rtf您可以访问这些变量的输入文件匹配:

    • INPUT_FILE_PATH=/path/to/your/project/source/Test.rtf
    • INPUT_FILE_NAME=Test.rtf
    • INPUT_FILE_BASE=Test
    • INPUT_FILE_SUFFIX=.rtf
    • INPUT_FILE_DIR=/path/to/your/project/source/

    您想要处理您的文件并将其发送到${DERIVED_FILES_DIR}您需要的任何新文件名或扩展名的目录。在这种情况下,我们从输入中获取基本文件名并给它一个新的扩展名。

    使用您在脚本中使用的相同输出文件填写“输出文件”部分。这将确保依赖系统正常工作,并且文件将被复制到您的 .app。仅当输入已更改或 .app 中缺少输出文件时,才会运行该脚本。

    请注意,“输出文件”不应有双引号。Xcode 将为您引用路径。

    如果您的脚本生成多个输出文件,请同时为这些文件添加额外条目。

完成所有设置后,添加到目标的 .rtf 文件将转换为脚本生成的任何输出文件。最终的 .app 中将不存在原始 .rtf 文件。

在哪里放置脚本/程序

作为旁注,是否有一些目录可以放置命令行工具,以便它们可用于当前版本的 Xcode?

将您的工具放在包含您的.xcproject. 然后从您的构建阶段/规则中使用${SRCROOT}环境变量,它是包含您的项目的目录:

假设这个文件系统布局:

/path/to/project/project.xcodeproj
/path/to/project/Tools/CommandLineTool

在您的构建阶段/规则中使用它:

"${SRCROOT}/Tools/CommandLineTool" "${INPUT_FILE_PATH}" ...

记得在任何地方都使用双引号!

于 2013-05-08T14:31:23.703 回答