如何使用 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
顶层文件夹可以随意命名,但Sources
和Tests
文件夹应保留其名称。在我有 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"]),
想知道如何创建一个库以便我可以这样做:
// 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
顶层文件夹可以随意命名,但Sources
和Tests
文件夹应保留其名称。在我有 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"]),