我們看看如何通過(guò)Swift Package Manager(以下簡(jiǎn)稱SPM)來(lái)構(gòu)建一個(gè)簡(jiǎn)單的開(kāi)發(fā)環(huán)境煎饼。
創(chuàng)建一個(gè)Product
假設(shè)我們要?jiǎng)?chuàng)建一個(gè)最基本的平衡二叉樹(shù)廉嚼,可以執(zhí)行下面這些命令:
mkdir BST
cd BST
swift package init --type=library
這樣,SPM就會(huì)為我們創(chuàng)建下面的目錄結(jié)構(gòu):

在這個(gè)目錄結(jié)構(gòu)里告组,我們可以了解以下內(nèi)容:
- Swift通過(guò)Modules來(lái)管理代碼,默認(rèn)情況下癌佩,所有在Sources目錄下的文件都在同一個(gè)module中(稍后我們也會(huì)看到多個(gè)module的情況)木缝;
- 所有Sources目錄中的代碼和根目錄的Package.swift文件形成了一個(gè)Package;
- 在一個(gè)Package里围辙,我們可以定義一個(gè)或多個(gè)Target我碟;
- Target可以是我們?cè)谝婚_(kāi)始定義的library,它可以被其他的Swift module使用姚建;也可以是一個(gè)executable矫俺,稍后,我們會(huì)看到它的用法掸冤;
創(chuàng)建第一個(gè)module
在Sources根目錄中厘托,所有源代碼默認(rèn)都是在同一個(gè)module中的。我們先在BST.swift
中編寫一些示例代碼:
open class BST {
public init() {
print("New BST initialized.")
}
}
extension BST: CustomStringConvertible {
public var description: String {
return "BST"
}
}
它們當(dāng)然還不是BST
的正式實(shí)現(xiàn)稿湿,我們?cè)谶@里只是為了演示module的用法铅匹。然后,我們?cè)?code>Tests/BSTTests/BSTTests.swift里饺藤,添加一個(gè)演示用的測(cè)試用例:
class BSTTests: XCTestCase {
func testExample() {
XCTAssertEqual(BST().description, "BST")
}
}
因?yàn)槲覀儗?shí)現(xiàn)的CustomStringConvertible
只是簡(jiǎn)單返回了字符串"BST"伊群,因此上面的比較應(yīng)該是相等的。
完成之后策精,在項(xiàng)目根目錄執(zhí)行:swift build
,我們就生成了一個(gè)Swift module:

執(zhí)行swift test
崇棠,SPM就會(huì)幫我們完成之前定義的測(cè)試用例:

從上面的結(jié)果可以看到咽袜,所有測(cè)試都通過(guò)了。不過(guò)枕稀,我們創(chuàng)建library询刹,最終還是為了提供給應(yīng)用程序使用的谜嫉。因此,接下來(lái)凹联,我們就來(lái)了解如何給package添加一個(gè)可執(zhí)行程序沐兰,我們把它定義在一個(gè)新的module中。
創(chuàng)建多個(gè)module
默認(rèn)情況下蔽挠,Sources目錄中所有代碼都是在同一個(gè)module中的住闯。因此,要?jiǎng)?chuàng)建多個(gè)module澳淑,我們要在Sources目錄中創(chuàng)建多個(gè)子目錄比原,像這樣:
-
BST
:表示BST module,并且把之前創(chuàng)建的BST.swift
移動(dòng)到這里杠巡; -
Application
:表示我們要新添加的應(yīng)用程序量窘;在其中,添加一個(gè)main.swift
氢拥;這是每一個(gè)應(yīng)用程序都必須定義的文件蚌铜;
最終,我們的目錄看起來(lái)是這樣的:

然后嫩海,在main.swift
中冬殃,添加下面的代碼:
import BST
let bst = BST()
print(bst)
重新執(zhí)行swift build
,我們會(huì)得到下面的錯(cuò)誤:

顯然出革,盡管我們使用了import BST
造壮,SPM在生成Application module的時(shí)候,并不知道它和BST之間存在依賴關(guān)系骂束。為了解決這個(gè)問(wèn)題耳璧,我們需要在Package.swift中,添加必要的依賴關(guān)系:
let package = Package(
name: "BST",
targets: [
Target(name: "Application", dependencies: ["BST"])
]
)
這樣展箱,我們就創(chuàng)建了一個(gè)叫做Application的target旨枯,它依賴我們之前創(chuàng)建的BST module。完成后混驰,重新執(zhí)行swift build
攀隔,就可以看到成功了:

編譯好的兩個(gè)swift module在./build/debug
目錄中,我們直接執(zhí)行Application
就可以看到結(jié)果了:
