簡體   English   中英

使用 Swift Package Manager 時如何導入包的依賴?

[英]How to import a package's dependency when using Swift Package Manager?

我開始了一個新的 Xcode 項目。 我使用 Swift Package 管理器(例如Quick )導入了 package 。

我在 Xcode 的側邊欄中看到 Quick。

我現在可以通過首先導入 Quick 來使用它:

import Quick

一切都適用於 Quick。


我注意到在 Xcode 的側邊欄中,當我導入 Quick 時,它會自動導入其依賴項(例如Nimble )。

我以為我可以通過導入它來開始使用這個依賴項,但這會導致錯誤:

import Quick
import Nimble // ❌ No such module 'Nimble'

如果我嘗試省略import並直接使用 Nimble 中的一行代碼,我也會收到錯誤消息:

expect(1 + 1).to(equal(3)) // Use of unresolved identifier 'expect'

如何在我的項目中使用 Nimble?


我猜想解決這個問題的一種方法是通過 Swift Package 管理器顯式添加 Nimble package。

但是,這似乎是錯誤的,因為:

  1. 我的 Xcode 項目中已經有了 Nimble 的源代碼
  2. 我不希望從 Swift Package Manager 獲得的顯式 Nimble 版本與從 Quick 獲得的隱式 Nimble 版本之間存在版本不匹配。

使用 Swift Package Manager 時如何導入包的依賴項?

要在您的項目中使用 Nimble,您必須以與 Quick 相同的方式使用 SPM 安裝它。 你可以在你的班級中導入 Quick

1- SPM 只下載一次依賴項,顯然是相同版本或范圍。

2- 您必須控制版本,在相同的版本范圍內設置依賴項。

Swift package 清單具有產品字段,庫作者可以使用該字段來聲明對客戶端可用的構建工件:

package 產品定義了可供 package 的客戶使用的外部可見構建工件。 產品由一個或多個包目標的構建工件組裝而成

每當您使用 package 時,您都可以選擇導入這些聲明產品使用的目標。 假設您有包含產品B的包裝A並且在產品B中以CD為目標,使用A時可以導入CD

現在,假設 package ACD中分別使用 package E的目標FG 在這種情況下,使用 package A還可以使 package E中的FG可用於您的項目。

現在讓我們考慮您的場景:您正在使用 package Quick的產品Quick ,它公開了目標Quick並且您可以毫無問題地導入Quick 盡管 package Quick在其測試目標內部使用 package Nimble ,但它並未在Quick目標中使用Nimble ,這是 ZEFE90A8E604A7C840E88D03A67F6B7D8 公開使用的目標。 要使用Nimble ,您必須明確添加Nimble package。

但是,這似乎是錯誤的,因為:

  1. 我的 Xcode 項目中已經有了 Nimble 的源代碼
  2. 我不希望從 Swift Package Manager 獲得的顯式 Nimble 版本與從 Quick 獲得的隱式 Nimble 版本之間存在版本不匹配。

我會說這種行為是正確的,應該是可以預料的。 依賴關系管理器允許依賴關系作者使用適當的約束來指定他們的依賴關系,並且Quick的作者已經指定他們的公共目標Quick對 package Nimble及其任何目標沒有任何依賴關系。 這為您提供了獨立選擇包QuickNimble的版本約束的靈活性,這是您所期望的,因為它們的作者告訴 SPM 它們是獨立的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM