咱们看看如何经过Swift Package Manager(如下简称SPM)来构建一个简单的开发环境。github
假设咱们要建立一个最基本的平衡二叉树,能够执行下面这些命令:swift
mkdir BST cd BST swift package init --type=library
这样,SPM就会为咱们建立下面的目录结构:app
在这个目录结构里,咱们能够了解如下内容:测试
Swift经过Modules来管理代码,默认状况下,全部在Sources目录下的文件都在同一个module中(稍后咱们也会看到多个module的状况);网站
全部Sources目录中的代码和根目录的Package.swift文件造成了一个Package;ui
在一个Package里,咱们能够定义一个或多个Target;spa
Target能够是咱们在一开始定义的library,它能够被其余的Swift module使用;也能够是一个executable,稍后,咱们会看到它的用法;debug
在Sources根目录中,全部源代码默认都是在同一个module中的。咱们先在BST.swift
中编写一些示例代码:code
open class BST { public init() { print("New BST initialized.") } } extension BST: CustomStringConvertible { public var description: String { return "BST" } }
它们固然还不是BST
的正式实现,咱们在这里只是为了演示module的用法。而后,咱们在Tests/BSTTests/BSTTests.swift
里,添加一个演示用的测试用例:
class BSTTests: XCTestCase { func testExample() { XCTAssertEqual(BST().description, "BST") } }
由于咱们实现的CustomStringConvertible
只是简单返回了字符串"BST",所以上面的比较应该是相等的。
完成以后,在项目根目录执行:swift build
,咱们就生成了一个Swift module:
执行swift test
,SPM就会帮咱们完成以前定义的测试用例:
从上面的结果能够看到,全部测试都经过了。不过,咱们建立library,最终仍是为了提供给应用程序使用的。所以,接下来,咱们就来了解如何给package添加一个可执行程序,咱们把它定义在一个新的module中。
默认状况下,Sources目录中全部代码都是在同一个module中的。所以,要建立多个module,咱们要在Sources目录中建立多个子目录,像这样:
BST
:表示BST module,而且把以前建立的BST.swift
移动到这里;
Application
:表示咱们要新添加的应用程序;在其中,添加一个main.swift
;这是每个应用程序都必须定义的文件;
最终,咱们的目录看起来是这样的:
而后,在main.swift
中,添加下面的代码:
import BST let bst = BST() print(bst)
从新执行swift build
,咱们会获得下面的错误:
显然,尽管咱们使用了import BST
,SPM在生成Application module的时候,并不知道它和BST之间存在依赖关系。为了解决这个问题,咱们须要在Package.swift中,添加必要的依赖关系:
let package = Package( name: "BST", targets: [ Target(name: "Application", dependencies: ["BST"]) ] )
这样,咱们就建立了一个叫作Application的target,它依赖咱们以前建立的BST module。完成后,从新执行swift build
,就能够看到成功了:
编译好的两个swift module在./build/debug
目录中,咱们直接执行Application
就能够看到结果了: