WWDC gave us many causes to each migrate libraries to SwiftPM and to develop new ones to assist our work. The mixing between Xcode improvement and SwiftPM dependencies retains rising stronger and extra essential.
Apple’s Modifying a Package deal Dependency as a Native Package deal assumes you’ll drag in your bundle to an Xcode challenge as a neighborhood bundle overrides one which’s imported via a standard bundle dependency.
In Growing a Swift Package deal in Tandem with an App, Apple writes, “To develop a Swift bundle in tandem with an app, you’ll be able to leverage the habits whereby a neighborhood bundle overrides a bundle dependency with the identical title…in case you launch a brand new model of your Swift bundle or wish to cease utilizing the native bundle, take away it from the challenge to make use of the bundle dependency once more.”
I don’t use this strategy. It’s not dangerous or mistaken, it simply doesn’t match my fashion.
Then again, opening the Package deal.swift file on to develop has drawbacks in that it doesn’t absolutely provide Xcode’s suite of IDE assist options but.
So I’ve been engaged on a private answer that greatest works for me. I would like my bundle improvement and its assessments to reside individually from any particular consumer app outdoors a testbed. I want to make sure that my code will swift construct
and swift check
correctly however I additionally wish to use Xcode’s built-in compilation and unit testing with my pleased inexperienced checks.
I set out to determine how greatest, at the very least for me, to develop Swift packages underneath the xcodeproj
umbrella.
I first explored swift bundle generate-xcodeproj
. This builds an Xcode library challenge full with assessments and a bundle goal. You should 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 Exams/ Creating Exams/LinuxMain.swift Creating Exams/GenerateTests/ Creating Exams/GenerateTests/GenerateTests.swift Creating Exams/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 world ignore file. That is what the ensuing challenge appears to be like like:
As you see, the generated Xcode challenge has every little 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 seemed into utilizing a playground however let’s face it: too sluggish, 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 solution to construct my base bundle atmosphere. It’s hacky however I a lot choose the result. As a substitute of producing the challenge, I begin with a testbed challenge after which create my bundle. This strategy 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 assessments. The library folder you see right here comprises solely an Data.plist and a bridging header. It in any other case builds from no matter Sources I’ve added.
I a lot choose this set-up to the generate-xcodeproj
strategy, though it takes barely longer to set-up. The rationale for that is that SwiftPM and Xcode use totally different philosophies for the way a challenge folder is structured. SwiftPM has its Sources and Exams. Xcode makes use of a supply folder named after the challenge.
So I take away that folder, add a Sources group to the challenge, and make sure that my construct phases sees and compiles these recordsdata. The Exams want related tweaks, plus I’ve so as to add a symbolic hyperlink from Xcode’s assessments title (e.g. “ProjectNameExams”) to my SwiftPM Exams folder on the high degree of my challenge to get it to all hold collectively. As soon as I’ve completed 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 appropriate instruments at hand.
Since I’m speaking about set-up, let me add that my duties additionally embody establishing the README, including a license and creating the preliminary change log. These are SwiftPM setup duties that swift bundle init
doesn’t cowl the way in which I like. I trash .gitignore
however since I’ve Xcode set-up to mechanically initialize model management, I don’t need to git init
by hand.
I think it is a short-term workaround as I count on the mixing of SwiftPM and Xcode to proceed rising over the subsequent couple of years. Since WWDC, I’ve been significantly enthusiastic about creating, deploying, and integrating SwiftPM packages. I believed I’d share this in case it’d assist others. Let me know.