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

时间:2018-08-19 11:21:07

标签: swift module package static-libraries

思考如何创建一个库,以便我可以这样做:

// in MyProject/main.swift
import MyLibrary

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

目前,我只是在编译如下这样的快速文件:

swiftc main.swift

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

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

1 个答案:

答案 0 :(得分:1)

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

要将您的库转换为Swift Package Manager,其源文件必须位于以下目录结构中:

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"]),