Simple, Nested Static Libraries
In this example, the PackageConsumer
utility simply consumes Package_BPrime
, Version 1.0.0, which is a static library, that, in turn, consumes Package_A
Version 1.0.0 (also a static library).
Here is the GitHub link to the PackageConsumer
project Version 2.0.0. You can check out that version, and reproduce the results here.
Here is the source code for Package_BPrime
, version 1.0.0:
import Foundation import Package_A public struct Package_BPrime: PackageProtocol { public let indent: Int public let text: String public init(indent inIndent: Int = 0) { indent = inIndent let prefix = String(repeating: "\t", count: inIndent) text = "\(prefix)Package_BPrime, Version: 1.0.0\n" + Package_A(indent: inIndent + 1).text } }
Here is the source for the Package_BPrime
, Version 1.0.0 Package.swift
file:
import PackageDescription let package = Package( name: "Package_BPrime", platforms: [ .iOS(.v11), .tvOS(.v11), .macOS(.v10_14), .watchOS(.v5) ], products: [ .library( name: "Package-BPrime", targets: ["Package_BPrime"]), ], dependencies: [ .package(name: "Package_A", url: "git@github.com:LittleGreenViper/SPMArticle-Package_A.git", from: "1.0.0") ], targets: [ .target( name: "Package_BPrime", dependencies: [ .product(name: "Package-A", package: "Package_A") ] ), .testTarget( name: "Package_BPrimeTests", dependencies: ["Package_BPrime"] ), ] )
Here is the source code for Package_A
, version 1.0.0:
import Foundation public protocol PackageProtocol { var text: String { get } var indent: Int { get } } public struct Package_A: PackageProtocol { public let indent: Int public let text: String public init(indent inIndent: Int = 0) { indent = inIndent let prefix = String(repeating: "\t", count: inIndent) text = "\(prefix)Package_A, Version: 1.0.0" } }
And here is its Package.swift
file:
import PackageDescription let package = Package( name: "Package_A", platforms: [ .iOS(.v11), .tvOS(.v11), .macOS(.v10_14), .watchOS(.v5) ], products: [ .library( name: "Package-A", targets: ["Package_A"]), ], targets: [ .target( name: "Package_A", dependencies: []), .testTarget( name: "Package_ATests", dependencies: ["Package_A"]), ] )
Here is the source for the PackageConsumer
Version 2.0.0 file:
import Foundation import Package_BPrime struct PackageConsumer { let text: String init(text intext: String = "PackageConsumer, Version 2.0.0") { text = intext + "\n" + Package_BPrime(indent: 1).text } }
Running that, gives us something like this in the console:
PackageConsumer, Version 2.0.0 Package_BPrime, Version: 1.0.0 Package_A, Version: 1.0.0
Why “Package_BPrime“?
This was because I found out that there seems to be some built-in module with an exposed module namespace of “Package_B
,” and declaring the package with that import name caused a very strange collision. Debugging this took me the better part of a day.