I'm developing a closed source framework that will be distributed as an XCFramework using SPM. This is possible thanks to the new binaryTarget(name:path:) and binaryTarget(name:url:checksum:) methods available in swift tools 5.3. This works fine until the framework has dependencies.
The Binary Frameworks in Swift talk from WWDC 2019 states that "binary frameworks cannot depend on packages" but this was before 5.3 and binary targets were not possible at all. On the Swift forums there is a suggested workaround that basically revolves around adding a dummy target that will list the dependencies (the binaryTarget(...)
methods don't have a dependencies
parameter).
The workaround works until the dependency has its own dependencies. For example Lottie which doesn't have any dependencies works fine, but Auth0 which has quite a few, fails with errors
Missing required modules: 'Auth0ObjectiveC', 'SimpleKeychain'
. Even adding Auth0 directly to the client project using SPM doesn't fix these errors.
Here is my Package.swift which works partially.
// swift-tools-version:5.3
import PackageDescription
let package = Package(
name: "MyFramework",
platforms: [
.iOS(.v13)
],
products: [
.library(name: "MyFramework", targets: ["MyFramework", "MyFramework-Dependencies"])
],
dependencies: [
.package(name: "Auth0", url: "https://github.com/auth0/Auth0.swift.git", from: "1.30.1")
],
targets: [
.binaryTarget(name: "MyFramework", path: "MyFramework.xcframework"),
.target(name: "MyFramework-Dependencies", dependencies: ["Auth0"], path: "MyFramework-Dependencies")
])
It it possible to actually have a binary framework depend on a package? If not, what would be the proper way distribute a dependency for a binary framework?