如何使用 swiftc 创建可导入的 Swift 库

How to create an importable Swift library with swiftc

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

// in MyProject/main.swift
import MyLibrary

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

目前我正在编译这样的 swift 文件:

swiftc main.swift

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

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

如果您只打算在 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"]),