这个项目提供了一个安全保障,确保你的同事和 Git 都不会搞砸你的 Xcode 项目文件。一些设置在某种程度上可能取决于个人喜好。幸运的是,每个选项都可以单独启用。 xcprojectlint
目前支持以下检查:
build-settings-externalized (构建设置外部化)
此模式确保项目级别没有配置任何设置,而是鼓励使用 xcconfig 文件。
dangling-source-files (悬挂的源文件)
确保所有源代码文件都是一个 Target 的成员。
disk-layout-matches-project (磁盘布局匹配项目)
此模式确保项目引用反映实际的文件系统位置。在某些情况下,你可能无法将文件夹完全映射到磁盘(Frameworks 和 Products 是常见的例子)。为此,你可以传递一个额外的参数:--skip-folders
,后跟要忽略的文件夹列表。
files-exist-on-disk (文件存在于磁盘上)
此模式查找项目中存在引用,但磁盘上不存在相应的文件。
empty-groups (空组)
此模式报告不包含任何其他项的组。
items-in-alpha-order (条目按字母顺序排列)
此模式确保项目文件和文件夹按正确的顺序排列。在某些情况下,你可能无法在特定文件夹中完全排序条目(Frameworks 和 Products 是常见的例子)。为此,你可以传递一个额外的参数:--skip-folders
,后跟要忽略的文件夹列表。
no-white-space-specifications (无空格规范)
此模式确保没有文件或项目包含以下空格规范:indentWidth、tabWidth、usesTabs 或 lineEnding。
all (全部)
为了方便起见,此模式运行以上所有测试。
当检测到失败条件时,尽可能多地将有用的上下文输出到 STDOUT
,使 Xcode 能够就地显示错误。此外,它可以选择返回 EX_SOFTWARE
,阻止构建成功,直到问题得到解决。
要构建 xcprojectlint
工具,请运行
$ swift package update
$ make build
要在 Xcode 中使用项目和测试,请运行
$ xed .
作为构建脚本阶段
bin/xcprojectlint --report error --validations all --project $PROJECT_FILE_PATH
作为 shell 命令
xcprojectlint --report error --validations files-exist-on-disk items-in-alpha-order
--project /tmp/Example/Example.xcproject
xcprojectlint
正在操作一个未文档化的文件格式。多年来查看损坏的 Git 合并使我们有理由相信我们知道各个部分如何协同工作。也就是说,这仍然是一个最佳猜测,因此可能存在疏忽。幸运的是,这些 lint 操作是只读的,不会修改您的项目文件。
每次运行都从将项目文件解析为一系列集合开始,这些集合代表我们对项目文件如何组成的理解。它使用属性列表结构和 Xcode 写入项目中的注释来组装其数据。之后,xcprojectlint 将有效性测试应用于提取的集合,确保满足指定的规则。
xcprojectlint 将尽可能尝试告诉您如何定位问题。它会告诉您哪个构建配置具有设置,组的预期顺序是什么,以及它可以从可用上下文中提取的其他信息。有时,它甚至会告诉您要查看的项目文件中的行号。这很棒,但 * 不要尝试在 Xcode 中查看该项目。* 会发生可怕的事情。相反,请使用你喜欢的文本编辑器来查看内部。
构建设置外部化
我们迭代所有的 BuildConfiguration
blobs,并调查它们的 BuildSettings
条目。 空设置是可以接受的。 任何找到的设置都是错误的。
悬挂的源文件
遍历项目中项目导航器中出现的所有源文件,并确保所有文件都与同一项目/工作空间中的 Target 相关联。 找到的任何悬挂文件都会导致错误。 这对于测试文件特别有用。
磁盘布局匹配项目
此测试从项目中获取 MainGroup
,然后递归遍历子节点。 如果子节点是一个文件,我们通过 ID 检索 FileReference
,然后检查 name
值。 存在名称表示此文件引用在磁盘上没有匹配的文件。
文件存在于磁盘上
这使用与布局测试类似的递归,但不是调查 name
值,而是构建一个 URL,指向文件应该出现在磁盘上的位置。 这是通过组装导致该文件的路径,然后将其附加到从磁盘上项目路径派生的路径,然后最终测试该位置是否存在文件来完成的。
空组
最简单的测试之一。 我们再次递归 MainGroup
,但这次查找具有零个子条目的条目。
条目按字母顺序排列
我们希望我们的项目节点包含按字母顺序排列的文件夹,后跟按字母顺序排列的文件。 我们通过再次递归组来检查这一点,并在每个级别将条目筛选到 groupNames
,fileNames
和 allNames
中。 我们对组和文件进行排序,将它们连接起来,然后将其与所有内容的列表进行比较。
无空格规范
Xcode 提供了一种方式,用户可以在 Preferences -> Text Editing -> Indentation
中指定制表符、空格、缩进量和换行符的自定义设置。 格式偏好也可以在文件或项目级别设置,如果未经注意通过 PR,则会改变团队成员的体验。 此规则旨在消除任何空格规范的存在,并为每个规范及其在项目文件中的位置提供适当的消息。
我们欢迎您对 Github 上 American Express 开源社区的兴趣。 对 American Express 开源社区管理的任何开源项目的任何贡献者都必须接受并签署协议,表明同意以下条款。 除本协议授予 American Express 和 American Express 分发的软件接收者的权利外,您保留对您的贡献的任何及所有权利、所有权和利益(如果有)。 请填写协议。
请随时打开拉取请求。 在提交 PR 之前,请使用提供的配置文件通过 swiftformat
运行您的代码:swiftformat --config swiftformat.config Sources/ Tests/
根据本项目做出的任何贡献均受Apache License 2.0约束。
本项目遵循美国运通社区准则。 通过参与,您应该遵守这些准则。