Why this happens
Xcode 10 introduced a new build system that is much stricter about duplicate work. When it detects that two build phases would write the same file to the app bundle, it stops the build instead of silently picking one, and you get an error like:
error: Multiple commands produce '.../OptimalLive.app/Info.plist':
1) Target 'OptimalLive' has copy command from '.../OptimalLive/Info.plist' to '.../OptimalLive.app/Info.plist'
2) Target 'OptimalLive' has copy command from '.../OptimalLive/Server/Masonry/Info.plist' to '.../OptimalLive.app/Info.plist'
3) Target 'OptimalLive' has process command with input '.../OptimalLive/Info.plist'
The root cause is almost always that the project’s Info.plist file ended up in the Copy Bundle Resources build phase. Older build systems tolerated this: the file got copied twice and nobody noticed. The new system sees a conflict between the “process” command that generates the final Info.plist and the “copy” command that copies the raw file as a resource, and refuses to build.
This commonly happens after dragging a folder into the project with “Create groups” or “Create folder references”, which can add every file inside — including Info.plist — to the resources phase. Vendored subprojects (like the Server/Masonry path in the error above) can also contribute their own plists to the same phase.
How to fix it
1. Remove Info.plist from Copy Bundle Resources
This is the standard fix and it resolves the error in nearly every case:
- In the Project navigator, click the blue project icon, then select the target in the Targets list.
- Open the Build Phases tab.
- Expand Copy Bundle Resources.
- Find
Info.plistin the list (use the search field at the bottom of the phase if the list is long). - Select it and press the – (minus) button to remove it. Do not choose “Move to Trash” — this only removes it from the build phase, the file stays on disk.
- Repeat for any other plist listed in the error, such as a nested subproject’s
Info.plist. - Choose Product → Clean Build Folder (Shift+Cmd+K), then build again.
The target still needs its Info.plist — it is consumed by the Info.plist File build setting (INFOPLIST_FILE) in the Build Settings tab, not by the resources phase. Removing it from Copy Bundle Resources does not break anything.
If you also have a watchOS app, apply the same cleanup to the watch app target and the watch extension target: each can have its own Info.plist accidentally listed in Copy Bundle Resources.
2. Check for duplicate plists from folder references
If the error persists, look at the two source paths in the error message. If one of them is inside a folder that was added as a group or folder reference (for example Server/Masonry/Info.plist), that nested project’s plist is being swept into your resources phase:
- Open Build Phases → Copy Bundle Resources again.
- Remove every
.plistentry that belongs to a subfolder or vendored library, not to your app target. - If a whole folder reference is pulling in unwanted files, remove the folder from Copy Bundle Resources and re-add only the files you actually need as resources.
3. Last resort: switch back to the Legacy Build System
If you need to ship immediately and can’t untangle the phases right now, you can temporarily revert:
- Go to File → Project Settings (or Workspace Settings).
- Under Build System, choose Legacy Build System.
- Clean and rebuild.
This makes the error go away because the old system tolerates the duplicate copy. Treat it as a stopgap only: Apple deprecated the Legacy Build System starting with Xcode 12 and it will be removed in a future release, so the duplicate-resource problem will eventually have to be fixed properly. Staying on the new build system also keeps incremental builds fast and catches real conflicts like this one.
How to prevent it
- When adding files or folders to a project, uncheck the target membership for
Info.plistfiles, or add only the resource files you need instead of entire directories. - After migrating a project from an older Xcode version, scan Build Phases → Copy Bundle Resources once and remove any
Info.plistentries. - For projects with watch apps or extensions, check the Copy Bundle Resources phase of every target, not just the app target.
- Keep the new build system enabled so these conflicts surface at build time instead of producing a subtly wrong bundle.
FAQ
Why did this only start failing in Xcode 10?
The new build system introduced in Xcode 10 treats two commands writing the same output file as a hard error, while the legacy system silently allowed the duplicate copy. Your project likely had the duplicate Info.plist in Copy Bundle Resources all along.
Will removing Info.plist from Copy Bundle Resources break my app?
No. The file is still used by the build through the INFOPLIST_FILE build setting, which processes it into the final app bundle. The Copy Bundle Resources entry was a redundant second copy.
The error mentions a plist from a third-party library. What do I do?
Remove that plist from your target’s Copy Bundle Resources phase as well. If the library’s build phases are the source, remove the library’s folder from your resources phase and link the library product instead, so its resources are handled by its own target.
Parts of this guide are adapted from content licensed under CC BY-SA 4.0; this article is shared under the same license.
