A special method to develop SwiftPM Packages inside Xcode tasks — Erica Sadun


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 necessary.

Apple’s Modifying a Bundle Dependency as a Native Bundle assumes you’ll drag in your package deal to an Xcode venture as a neighborhood package deal overrides one which’s imported by means of a standard package deal dependency.

In Creating a Swift Bundle in Tandem with an App, Apple writes, “To develop a Swift package deal in tandem with an app, you may leverage the habits whereby a neighborhood package deal overrides a package deal dependency with the identical identify…if you happen to launch a brand new model of your Swift package deal or need to cease utilizing the native package deal, take away it from the venture to make use of the package deal dependency once more.”

I don’t use this method. It’s not unhealthy or mistaken, it simply doesn’t match my type.

Alternatively, opening the Bundle.swift file on to develop has drawbacks in that it doesn’t totally supply Xcode’s suite of IDE assist options but.

So I’ve been engaged on a private resolution that greatest works for me. I need my package deal improvement and its assessments to stay individually from any particular consumer app exterior a testbed. I would like to make sure that my code will swift construct and swift take a look at correctly however I additionally need to use Xcode’s built-in compilation and unit testing with my blissful inexperienced checks.

I set out to determine how greatest, at the least for me, to develop Swift packages below the xcodeproj umbrella.

I first explored  swift package deal generate-xcodeproj. This builds an Xcode library venture full with assessments and a package deal goal. You need to use the --type flag to set the package deal to executable, system-module, or manifest as an alternative of the default (library) throughout swift package deal init:

Generate% swift package deal init
Creating library package deal: Generate
Creating Bundle.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 package deal 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 at all times find yourself deleting the .gitignore as I take advantage of a personalized world ignore file. That is what the ensuing venture appears like:

As you see, the generated Xcode venture has every part 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 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 special method to construct my base package deal atmosphere. It’s hacky however I a lot want the end result. As an alternative of producing the venture, I begin with a testbed venture after which create my package deal. This method naturally packs a pattern with the package deal however none of that pattern leaks into the package deal 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 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 completely different philosophies for a way a venture folder is structured. SwiftPM has its Sources and Exams. Xcode makes use of a supply folder named after the venture.

So I take away that folder, add a Sources group to the venture, and be sure that my construct phases sees and compiles these information. The Exams want comparable tweaks, plus I’ve so as to add a symbolic hyperlink from Xcode’s assessments identify (e.g. “ProjectNameExams”) to my SwiftPM Exams folder on the high stage of my venture to get it to all dangle collectively. As soon as I’ve executed so my inexperienced checks are prepared and ready simply as if I had opened the Bundle.swift file instantly. However this time, I’ve all the correct 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 package deal init doesn’t cowl the best way I like. I trash .gitignore however since I’ve Xcode set-up to routinely initialize model management, I don’t should git init by hand.

I think this can be 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 growing, deploying, and integrating SwiftPM packages. I believed I’d share this in case it’d assist others. Let me know.

Recent Articles

Related Stories

Leave A Reply

Please enter your comment!
Please enter your name here

Stay on op - Ge the daily news in your inbox