Xcode Run Script无法写入项目源码目录,如何解决?
解决PlistBuddy无法写入$(SRCROOT)/$(PROJECT_NAME)目录的问题
核心原因分析
- Xcode构建沙箱限制:当在Run Script中指定Output Files时,Xcode会启动构建沙箱,仅允许脚本写入你明确声明的输出路径。如果目标子目录未被沙箱授权,或者路径解析存在问题,就会触发"Operation not permitted"错误。
- 目录存在性问题:如果$(SRCROOT)/$(PROJECT_NAME)目录因某种原因不存在,直接写入也会导致权限类报错。
具体解决步骤
1. 先确保目标目录存在
在执行PlistBuddy命令前,先添加创建目录的命令,避免因目录缺失导致的写入失败:
mkdir -p "$(SRCROOT)/$(PROJECT_NAME)"
2. 验证Output Files路径的正确性
确认Output Files栏填写的路径是绝对路径且变量解析正常:
$(SRCROOT)/$(PROJECT_NAME)/out.plist
可以在脚本开头添加打印语句验证路径:
echo "目标路径:$(SRCROOT)/$(PROJECT_NAME)/out.plist"
如果输出路径不符合预期,检查PROJECT_NAME变量在当前构建阶段是否正确赋值(比如CocoaPods项目中可能需要调整变量引用)。
3. 临时关闭构建沙箱(仅作排查用,不推荐长期使用)
如果前两步无效,可以尝试关闭Run Script的沙箱限制:
- 选中Run Script阶段,取消勾选Run script only when installing(若已勾选)
- 或者在Build Settings中搜索
ENABLE_USER_SCRIPT_SANDBOXING,将其设为NO
注意:关闭沙箱会降低构建安全性,仅作为临时排查手段,优先用前两种方法。
4. 替换PlistBuddy为Xcode友好的plist生成方式
如果PlistBuddy的权限问题难以解决,改用plutil结合模板文件的方式:
- 先创建一个
Template.plist模板文件:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>SwiftFlags</key> <string></string> </dict> </plist> - 在Run Script中执行替换生成命令:
plutil -replace SwiftFlags -string "$OTHER_SWIFT_FLAGS" "$(SRCROOT)/Template.plist" -o "$(SRCROOT)/$(PROJECT_NAME)/out.plist"
这种方式更贴合Xcode构建规范,权限问题更少。
内容的提问来源于stack exchange,提问作者Michael Gaines
相关产品推荐
相关产品推荐

