【问题标题】:How to create an importable Swift library with swiftc如何使用 swiftc 创建可导入的 Swift 库
【发布时间】:2018-08-19 19:58:00
【问题描述】:

想知道如何创建一个库以便我可以这样做:

// in MyProject/main.swift
import MyLibrary

let x = MyLibrary("foo")
...

目前我只是在编译一个这样的 swift 文件:

swiftc main.swift

我也有一个Package.swift,所以它最终会在./main 生成一个main 文件。

想知道如何在本地执行此操作,因此我可以构建一个本地模块/库MyLibrary,并在另一个项目MyProject 中本地使用它。

【问题讨论】:

  • 您使用的是 Swift 包管理器还是只有一个 Package.swift 文件?
  • 我只有一个Package.swift 文件,其中包含import PackageDescription; let package = Package(name: "MyLibrary")
  • 您是打算只在 macOS/Linux 上使用这个库,还是打算同时使用 iOS/tvOS/watchOS?
  • 只有 macos,但知道两者都会很好。

标签: swift module package static-libraries


【解决方案1】:

如果您只打算在 macOS 或 Linux 上提供此库,我建议您切换到 Swift Package Manager。目前,SPM 仅适用于 macOS 和 Linux,不适用于 iOS/tvOS/watchOS。但是,它使库分发变得更加容易。

要将您的库转换为 Swift 包管理器,其源文件需要位于以下目录结构中:

MyLibrary-package
├── Sources
│   └── MyLibrary
│       ├── File1.swift
│       └── File2.swift
├── Tests
│   └── MyLibraryTests
│       └── MyLibraryTests.swift
└── Package.swift

顶层文件夹可以任意命名,但SourcesTests 文件夹应保留其名称。在我有MyLibrary 的地方,您可以输入您的包名称,但它必须与您的Package.swift 中的目标名称匹配。此外,无论您将MyLibraryTests 替换为什么,都必须与Package.swift 中的测试目标名称匹配。

您应该将所有源文件放在MyLibrary 目录(或您重命名的任何目录)中。

这是一个示例 Package.swift 文件,我认为它与您的项目设置相匹配。

// swift-tools-version:4.0

import PackageDescription

let package = Package(
    name: "MyLibrary",
    products: [
        .library(name: "MyLibrary", targets: ["MyLibrary"]),
    ],
    targets: [
        .target(name: "MyLibrary", dependencies: []),
        .testTarget(name: "MyLibraryTests", dependencies: ["MyLibrary"]),
    ]
)

一旦您移动了源文件并更改了Package.swift,您就可以运行swift build。您的库应该构建在 .build 文件夹(将被创建)中的某个位置。因电脑而异,但我的是.build/x86_64-apple-macosx10.10/debug/MyLibrary.build/

如果您特别想要一个静态库,请更改此行:

.library(name: "MyLibrary", targets: ["MyLibrary"]),

到这里:

.library(name: "MyLibrary", type: .static, targets: ["MyLibrary"]),

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2013-05-25
    • 1970-01-01
    相关资源
    最近更新 更多