如何通過Swift Package Manager 來構建一個簡單的開發環境
我們看看如何通過 Swift Package Manager (以下簡稱SPM)來構建一個簡單的開發環境。
創建一個Product
假設我們要創建一個最基本的平衡二叉樹,可以執行下面這些命令:
mkdir BST
cd BST
swift package init --type=library
這樣,SPM就會為我們創建下面的目錄結構:
在這個目錄結構里,我們可以了解以下內容:
-
Swift通過 Modules 來管理代碼,默認情況下,所有在 Sources 目錄下的文件都在同一個module中(稍后我們也會看到多個module的情況);
-
所有 Sources 目錄中的代碼和根目錄的 Package.swift 文件形成了一個 Package ;
-
在一個 Package 里,我們可以定義一個或多個 Target ;
-
Target 可以是我們在一開始定義的library,它可以被其他的Swift module使用;也可以是一個executable,稍后,我們會看到它的用法;
創建第一個module
在 Sources 根目錄中,所有源代碼默認都是在同一個module中的。我們先在BST.swift
中編寫一些示例代碼:
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中。
創建多個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
就可以看到結果了:
來自:https://segmentfault.com/a/1190000007100903