iOS Development

A unique option to develop SwiftPM Packages inside Xcode tasks — Erica Sadun

A unique option to develop SwiftPM Packages inside Xcode tasks — Erica Sadun
Written by admin


WWDC gave us many causes to each migrate libraries to SwiftPM and to develop new ones to assist our work. The mixing between Xcode growth and SwiftPM dependencies retains rising stronger and extra necessary.

Apple’s Modifying a Package deal Dependency as a Native Package deal assumes you’ll drag in your bundle to an Xcode venture as an area bundle overrides one which’s imported by means of 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 possibly can 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 venture to make use of the bundle dependency once more.”

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

However, opening the Package deal.swift file on to develop has drawbacks in that it doesn’t totally provide Xcode’s suite of IDE assist options but.

So I’ve been engaged on a private resolution that finest works for me. I need my bundle growth and its checks to stay individually from any particular shopper app outdoors a testbed. I want 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 venture full with checks and a bundle goal. You should use the --type flag to set the bundle to executable, system-module, or manifest as an alternative 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 at all times find yourself deleting the .gitignore as I exploit a personalized world ignore file. That is what the ensuing venture seems to be like:

As you see, the generated Xcode venture has the whole lot 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 regarded 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 special option to construct my base bundle setting. 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 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 comprises 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 rationale for that is that SwiftPM and Xcode use completely different philosophies for a way a venture folder is structured. SwiftPM has its Sources and Checks. 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 Checks want related 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 venture 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 instantly. 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 embrace 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 must git init by hand.

I believe this can be a short-term workaround as I anticipate 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 assumed I’d share this in case it’d assist others. Let me know.

About the author

admin

Leave a Comment