I am trying to use a Swift Package Manager to produce a framework.
I have a target, and then a library product for the platform of iOS 13.
let package = Package(
name: "SPMBasedA",
platforms: [.iOS(.v13)],
products: [
.library(name: "SPMBasedA",
type: .dynamic,
targets: ["SPMBasedA"])
],
targets: [
.target(name: "SPMBasedA")
]
)
My problem is that, when I swift build, the library product produces either an archive .a or a dynamically loadable library, .dylib.
But I want a static Swift framework. How do I make an SPM project to compile into a .framework?
Related
I have created a Swift Package via Xcode. This packaged defines a library:
let package = Package(
name: "SPMBasedA",
products: [
.library(
name: "SPMBasedA",
type: .static,
targets: ["SPMBasedA"]),
],
targets: [
.target(name: "SPMBasedA")
]
)
The scheme is well displayed in Xcode and project seems to compile properly, but whenever I archive, there are no products in the exported archive. Why is that, what am I doing wrong? How do I make the build artifacts appear? Is it related to SKIP_INSTALL? If so, how do I disable it in SPM?
I have a custom swift package I am building that has as one of its dependencies a package (Bugfender) that is an xcframework and is iOS only (and Mac Catalyst). Understandably, when I try to compile this package in Xcode (12.5) I get an error that a mac library for that package cannot be found (all iOS specific code is wrapped in a #if os(iOS) block).
Based on this (https://github.com/apple/swift-evolution/blob/master/proposals/0273-swiftpm-conditional-target-dependencies.md) addition to the Swift package spec, I thought I could use a condition to exclude the dependency for mac, but when I try the following Swift.package file, I still get the same error when building for mac. Is this a bug or am I doing something wrong? It seems like it should work based on this post as well (Swift package manager: How best to indicate platform dependent code?)
// swift-tools-version:5.3
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "GTSApplicationLogging",
platforms: [
.iOS(.v12), .macOS(.v10_13),
],
products: [
// Products define the executables and libraries a package produces, and make them visible to other packages.
.library(
name: "GTSApplicationLogging",
targets: ["GTSApplicationLogging"]),
],
dependencies: [
// Dependencies declare other packages that this package depends on.
.package(name: "BugfenderPackage", url: "https://github.com/bugfender/BugfenderSDK-iOS", .exact("1.10.2")),
.package(url: "https://github.com/SwiftyBeaver/SwiftyBeaver.git", .exact("1.9.5")),
.package(url: "https://github.com/marmelroy/Zip.git", .exact("2.1.1")),
.package(path: "../GTSPureAppleExtensions"),
.package(path: "../GTSApplicationError"),
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages this package depends on.
.target(
name: "GTSApplicationLogging",
dependencies: ["SwiftyBeaver", "GTSPureAppleExtensions", "GTSApplicationError", "Zip", .product(name: "BugfenderLibrary", package: "BugfenderPackage", condition: .when(platforms: [.iOS]))]),
.testTarget(
name: "GTSApplicationLoggingTests",
dependencies: ["GTSApplicationLogging", "GTSApplicationError"]),
])
I'm looking to integrate DVR into my tests for an HTTP request-heavy library I am writing. I'm using Swift Package Manager (on macOS 10.15 using the Xcode 11 Beta) to manage my dependencies and I'm unsure how to include my fixtures generated by DVR into my test target. How do I add my fixtures from DVR to my test target?
I've tried using the default Session configuration as well as attempting to store the fixtures in a Fixtures directory using Session(outputDirectory: "Fixtures", cassetteName: "example", testBundle: .main, backingSession: .shared)
My package file is as follows:
// swift-tools-version:5.1
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "Example",
products: [
// Products define the executables and libraries produced by a package, and make them visible to other packages.
.library(
name: "Example",
targets: ["Example"]),
],
dependencies: [
// Dependencies declare other packages that this package depends on.
.package(url: "https://github.com/venmo/DVR.git", from: "2.0.0")
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
.target(
name: "Example",
dependencies: []
),
.testTarget(
name: "ExampleTests",
dependencies: ["Example", "DVR"]
)
]
)
When running my tests, I get the error [DVR] Persisted cassette at Fixtures/example.json. Please add this file to your test target
I'm unsure how to add this directory to my test target.
Looks like this may be impossible as of Swift 5.1. Swift ticket: SR-2866
I want to know if there is anyway to link a swift package against a framework like SQLite.framework in Xcode? I'm trying to make a swift package for a sqlite library wrapper.
Here is my current swift package manifest:
// swift-tools-version:5.1
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "SQLiteDB",
products: [
// Products define the executables and libraries produced by a package, and make them visible to other packages.
.library(
name: "SQLiteDB",
targets: ["SQLiteDB"]),
],
dependencies: [
// .package(url: /* package url */, from: "1.0.0"),
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
.target(
name: "SQLiteDB",
dependencies: []),
.testTarget(
name: "SQLiteDBTests",
dependencies: ["SQLiteDB"]),
]
)
I ended up creating my own Sqlite package by embedding the amalgamation sources of sqlite. This gives you the ability to have any arbitrary version of Sqlite in your apps.
With the Xcode 12 beta, you can do this if you update your swift-tools-version to 5.3, and then add a binaryTarget to your package's targets:
.binaryTarget(
name: "Stripe",
url: "https://github.com/stripe/stripe-ios/releases/download/v19.3.0/Stripe.xcframework.zip",
checksum: "fe459dd443beee5140018388fd6933e09b8787d5b473ec9c2234d75ff0d968bd"
)
I'm trying to create a project using Swift Package Manager, but I'm running into issues trying to include the Fabric.framework.
Here is my Package.swift
let package = Package(
name: "TestPackage",
platforms: [
.iOS(.v10), .macOS(.v10_12)
],
products: [
// Products define the executables and libraries produced by a package, and make them visible to other packages.
.library(
name: "TestPackage",
targets: ["TestPackageSwift", "TestPackageObjC"]),
],
dependencies: [
.package(url: "https://github.com/Alamofire/Alamofire.git", from: "4.8.2"),
.package(path: "./TestPackage/Libraries/Fabric.framework"),
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
.target(
name: "TestPackageSwift",
dependencies: ["Alamofire", "Fabric"],
path:"./TestPackage/Sources/Swift"),
.target(
name: "TestPackageObjC",
dependencies: ["Fabric"],
path:"./TestPackage/Sources/ObjC"),
.testTarget(
name: "TestPackageTests",
dependencies: ["TestPackageSwift", "TestPackageObjC"],
path:"./TestPackageTests/Sources"),
]
)
And here is the error I am getting:
error: ./TestPackage/Libraries/Fabric.framework has no Package.swift manifest
Is this even possible?
Thanks for the help!