WWDC gave us many causes to each migrate libraries to SwiftPM and to develop new ones to assist our work. The combination between Xcode improvement and SwiftPM dependencies retains rising stronger and extra vital.
Apple’s Modifying a Package deal Dependency as a Native Package deal assumes you’ll drag in your bundle to an Xcode undertaking as an area bundle overrides one which’s imported by way of a traditional bundle dependency.
In Creating a Swift Package deal in Tandem with an App, Apple writes, “To develop a Swift bundle in tandem with an app, you may leverage the habits whereby an area bundle overrides a bundle dependency with the identical identify…in case you launch a brand new model of your Swift bundle or need to cease utilizing the native bundle, take away it from the undertaking to make use of the bundle dependency once more.”
I don’t use this method. It’s not dangerous or flawed, it simply doesn’t match my model.
Then again, opening the Package deal.swift file on to develop has drawbacks in that it doesn’t absolutely supply Xcode’s suite of IDE assist options but.
So I’ve been engaged on a private resolution that finest works for me. I would like my bundle improvement and its checks to reside individually from any particular shopper app exterior a testbed. I would like to make sure that my code will swift construct
and swift check
correctly however I additionally need to use Xcode’s built-in compilation and unit testing with my completely happy inexperienced checks.
I set out to determine how finest, at the least for me, to develop Swift packages below the xcodeproj
umbrella.
I first explored swift bundle generate-xcodeproj
. This builds an Xcode library undertaking full with checks and a bundle goal. You need to use the --type
flag to set the bundle to executable, system-module, or manifest as a substitute of the default (library) throughout swift bundle init
:
Generate% swift bundle init Creating library bundle: Generate Creating Package deal.swift Creating README.md Creating .gitignore Creating Sources/ Creating Sources/Generate/Generate.swift Creating Checks/ Creating Checks/LinuxMain.swift Creating Checks/GenerateTests/ Creating Checks/GenerateTests/GenerateTests.swift Creating Checks/GenerateTests/XCTestManifests.swift Generate% swift bundle generate-xcodeproj generated: ./Generate.xcodeproj
Though SwiftPM creates a .gitignore
file for you as you see, it doesn’t initialize a git repository. Additionally, I all the time find yourself deleting the .gitignore
as I take advantage of a personalized international ignore file. That is what the ensuing undertaking seems like:
As you see, the generated Xcode undertaking has every thing however a testbed for you. I actually like having an on-hand testbed, whether or not a easy SwiftUI app or a command line utility to play with concepts. I appeared into utilizing a playground however let’s face it: too gradual, too glitchy, too unreliable.
It’s a ache so as to add a testbed to this set-up, so I got here up with a unique technique to construct my base bundle setting. It’s hacky however I a lot want the result. As a substitute of producing the undertaking, I begin with a testbed undertaking after which create my bundle. This method naturally packs a pattern with the bundle however none of that pattern leaks into the bundle itself:
I find yourself with three targets: the pattern app, a library constructed from my Sources, and my checks. The library folder you see right here accommodates solely an Information.plist and a bridging header. It in any other case builds from no matter Sources I’ve added.
I a lot want this set-up to the generate-xcodeproj
method, though it takes barely longer to set-up. The explanation for that is that SwiftPM and Xcode use totally different philosophies for the way a undertaking folder is structured. SwiftPM has its Sources and Checks. Xcode makes use of a supply folder named after the undertaking.
So I take away that folder, add a Sources group to the undertaking, and be sure that my construct phases sees and compiles these information. The Checks want comparable tweaks, plus I’ve so as to add a symbolic hyperlink from Xcode’s checks identify (e.g. “ProjectNameChecks”) to my SwiftPM Checks folder on the high stage of my undertaking to get it to all cling collectively. As soon as I’ve accomplished so my inexperienced checks are prepared and ready simply as if I had opened the Package deal.swift file straight. However this time, I’ve all the precise instruments at hand.
Since I’m speaking about set-up, let me add that my duties additionally embody organising the README, including a license and creating the preliminary change log. These are SwiftPM setup duties that swift bundle init
doesn’t cowl the best way I like. I trash .gitignore
however since I’ve Xcode set-up to mechanically initialize model management, I don’t must git init
by hand.
I think this can be a short-term workaround as I anticipate the mixing of SwiftPM and Xcode to proceed rising over the following couple of years. Since WWDC, I’ve been significantly enthusiastic about growing, deploying, and integrating SwiftPM packages. I assumed I’d share this in case it would assist others. Let me know.