Error: Multiple commands produce

缘由

因为业务需要,在Xcode中复制了一个target,然后整理了工程树:新建了一些group,把相关的info.plist和asset整理到相应的组。接着,使用Xcode 10.2.1编译的时候出错:

error: Multiple commands produce '/Users/xxx/Library/Developer/Xcode/DerivedData/XXX/Build/Products/Debug-iphonesimulator/xxx.app/Info.plist': Target 'TARGET' (project 'PROJ') has copy command from '/Users/xxx/PROJ/Info.plist' to '/Users/xxx/Library/Developer/Xcode/DerivedData/XXX/Build/Products/Debug-iphonesimulator/xxx.app/Info.plist' Target 'TARGET' (project 'PROJ') has process command with output '/Users/xxx/Library/Developer/Xcode/DerivedData/XXX/Build/Products/Debug-iphonesimulator/xxx.app/Info.plist'

以上的背景和开发环境,下面是解决过程。

解决之道

一开始,没有仔细看error的内容,以为是plist文件移动后工程找不到target对应的plist文件。于是在 Build Phases 中将plist文件删除后再加入,发现还是不行。
这时仔细看了下错误信息,发现这个target是原先的target,怀疑是不是哪个编译设置不小心被误改了,接着在 Build Settings 中把 info.plist/copy/process相关的内容搜索了一下,没有发现。
无奈,google之,类似的问题解决的方法要么如上把plist文件重新添加,要么就是修改 workspace 中 Build System,将其设置为 legacy build system。按照第二种方法尝试,可以编译,但是这种方法不好:不能充分利用Xcode10的新编译性能。
就在一筹莫展之际,扫了一眼警告信息,发现系统有提示:TAEGET有部分编译设置有冲突,需要更新。点击后,Xcode自动进行了清理,然后发现编译成功了。很遗憾,应该在点击前 commit 一下,这样就可以找到 root cause 了。
最后,关于修改 Build System,万不得已下,千万不要修改成 legacy,否则“带薪编译”变长,996要向你招手了。