I recently wrote about using SwiftPM instead of CocoaPods, which included a list of pros and cons. While working on one of my projects that is using SwiftPM, I realized another issue with how SwiftPM currently integrates with Xcode.
I mentioned that there is no equivalent of a
Pods/ directory with SwiftPM and that package dependencies are stored in Xcode’s derived data directory,
~/Library/Developer/Xcode/DerivedData/. This is problematic beyond not being able to check-in dependencies into source control. What I failed to realize at the time are the implications for cleaning or deleting derived data, which unfortunately is often necessary when working with Xcode. In fact, I have a custom shell command for doing this (which I call
xcclean), and it runs
rm -rf ~/Library/Developer/Xcode/DerivedData. Most folks I know have something similar, because Xcode.
This will not work if you are using SwiftPM. If you completely nuke your
DerivedData/ directory and then attempt to build your project, it will fail to build with the error “Missing package product” for each package. To trigger re-downloading, you must choose
File > Swift Packages > Resolve Package Versions. What a pain this would be if you were working without an Internet connection.
Luckily, simply “cleaning” your build folder by choosing
Product > Clean Build Folder in the Xcode file menu, or
cmd+shift+K will do the correct thing, and leave your package sources intact.
I suppose I will have to update my
xcclean command to be smarter.