如何自动化将proto生成文件纳入Xcode项目流程
解决方案
以下是可覆盖所有问题的落地方案,全流程无需手动配置Compile Sources,也不会出现编译冲突:
一、替换原有Build Rule逻辑,改用预构建脚本统一生成代码
完全移除之前针对.proto文件配置的Xcode Build Rule,也不需要将任何.proto文件加入Compile Sources列表,改为在Build Phases最前面新增一个Run Script,脚本逻辑如下:
- 保留原有同步逻辑:删除旧的Protos目录,将后端维护的所有
.proto文件全量拷贝到项目的Protos目录 - 遍历
Protos目录下所有.proto文件,统一调用protoc命令生成对应代码,示例命令参考:
# 定义路径变量 PROTO_DIR="$SRCROOT/Protos" OUTPUT_DIR="$PROTO_DIR/generated" # 清空旧生成文件 rm -rf "$OUTPUT_DIR" mkdir -p "$OUTPUT_DIR" # 遍历所有proto文件生成代码 find "$PROTO_DIR" -name "*.proto" | while read -r proto_file; do protoc \ --proto_path="$PROTO_DIR" \ --grpc-swift_out="$OUTPUT_DIR" \ --swift_out="$OUTPUT_DIR" \ "$proto_file" done
- 将
$OUTPUT_DIR目录添加到Xcode项目的Derived Sources分组中,Xcode会自动识别该目录下所有Swift文件参与编译,同时支持代码索引跳转,不需要手动添加到Compile Sources。
二、对应问题的解决说明
- 针对后端新增
.proto自动识别问题:脚本是全量遍历所有.proto文件生成代码,新增的.proto会自动被处理,不需要手动修改任何项目配置 - 针对新成员重复配置问题:所有逻辑都已经内置在项目的Build Phases脚本中,新成员拉取代码后只要安装好
protoc和gRPC-Swift-Plugins依赖即可直接构建,不需要做额外配置 - 针对生成文件编译冲突问题:
原有冲突的根因是Build Rule对每个加入Compile Sources的.proto生成了一次代码,同时你手动添加的生成文件又被编译了一次,导致重复产物。改用上述方案后:- 不需要将
.proto加入Compile Sources,不会触发重复生成 - 生成文件放在Derived Sources目录,由Xcode统一管理编译,不会出现重复编译冲突
- 生成文件可以直接在Xcode中查看、跳转,满足编码参考需求
- 不需要将
三、额外优化建议
- 将
generated目录加入.gitignore,不需要提交生成的代码,避免多人生成版本冲突 - 可以将
protoc和gRPC-Swift-Plugins的二进制文件放到项目的工具目录中,脚本用相对路径调用,统一所有团队成员的工具版本,避免环境差异导致的生成错误 - 如果项目使用Swift Package Manager,也可以将Protos目录单独做成一个本地SPM包,生成逻辑封装在包的build tool plugin中,接入更简洁
内容的提问来源于stack exchange,提问作者Joshua
相关产品推荐
相关产品推荐

