Sunday, October 15, 2023
HomeiOS DevelopmentA distinct strategy to develop SwiftPM Packages inside Xcode tasks — Erica...

A distinct strategy 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 essential.

Apple’s Enhancing a Bundle Dependency as a Native Bundle assumes you’ll drag in your bundle to an Xcode undertaking as an area bundle overrides one which’s imported via a standard bundle dependency.

In Creating a Swift Bundle 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 an area bundle overrides a bundle dependency with the identical identify…if you happen to launch a brand new model of your Swift bundle or wish 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 strategy. It’s not unhealthy or incorrect, it simply doesn’t match my type.

Alternatively, opening the Bundle.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 answer that finest works for me. I need my bundle improvement and its assessments to stay individually from any particular shopper 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 wish to use Xcode’s built-in compilation and unit testing with my glad inexperienced checks.

I set out to determine how finest, not less than 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 assessments 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 Bundle.swift
Creating README.md
Creating .gitignore
Creating Sources/
Creating Sources/Generate/Generate.swift
Creating Assessments/
Creating Assessments/LinuxMain.swift
Creating Assessments/GenerateTests/
Creating Assessments/GenerateTests/GenerateTests.swift
Creating Assessments/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 exploit a custom-made world ignore file. That is what the ensuing undertaking appears like:

As you see, the generated Xcode undertaking has all the things 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 distinct strategy to construct my base bundle setting. It’s hacky however I a lot desire the result. As an alternative of producing the undertaking, I begin with a testbed undertaking 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 incorporates solely an Data.plist and a bridging header. It in any other case builds from no matter Sources I’ve added.

I a lot desire 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 completely different philosophies for the way a undertaking folder is structured. SwiftPM has its Sources and Assessments. 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 certain that my construct phases sees and compiles these information. The Assessments want comparable tweaks, plus I’ve so as to add a symbolic hyperlink from Xcode’s assessments identify (e.g. “ProjectNameAssessments”) to my SwiftPM Assessments folder on the prime stage of my undertaking to get it to all grasp collectively. As soon as I’ve performed so my inexperienced checks are prepared and ready simply as if I had opened the Bundle.swift file immediately. However this time, I’ve all the best 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 robotically initialize model management, I don’t should git init by hand.

I think it is a short-term workaround as I anticipate the combination 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 would assist others. Let me know.



Supply hyperlink

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

- Advertisment -
Google search engine

Most Popular

Recent Comments