因為項目需要接入 Magic錢包暮芭,所以我開始接入在項目了MagicSDK,是通過 SwiftPM 的方式玷室。接入過程中發(fā)現(xiàn) SwiftPM 報 multiple targets named 沖突了嗽交,導致接入失敗,下面就詳細說說沖突的原因和解決的方法慷嗜。
multiple targets named 沖突
先看看 SwiftPM 提示的錯誤信息
multiple targets named 'secp256k1' in: 'secp256k1.swift', 'web3swift'; consider using the `moduleAliases` parameter in manifest to provide unique names
可以看到是因為出現(xiàn)多個 targets named 為'secp256k1' 導致沖突了淀弹,首先我當前項目中通過 SwiftPM 引入了'web3swift',而web3swift 的Package文件中定義了一個Target名為 'secp256k1'庆械。而現(xiàn)在我需要引入的MagicSDK也同時引入了 'secp256k1'
尋找解決辦法
實際上上面的錯誤提示有給出一些建議薇溃,consider using the moduleAliases
parameter in manifest to provide unique names
因為Target Name 沖突了,swift 5.7 提供了 moduleAliases
別名設置來解決這個命名沖突缭乘°逍颍可以參考:https://github.com/apple/swift-evolution/blob/main/proposals/0339-module-aliasing-for-disambiguation.md
但是我的項目是通過Xcode 管理的 SwiftPM,不是通過 Package.swift 文件處理依賴關系。添加 moduleAliases
參數(shù)這個解決方案我就為有嘗試下去了薄啥。
我回去研究了web3swift
庫對 secp256k1
的使用辕羽,發(fā)現(xiàn)2個沖突的target是做同樣的功能,不過web3swift
是通過源碼方式引入垄惧,然后設置了target name來使用刁愿,MagicSDK
是通過 swiftPM 依賴引入 secp256k1
來使用。
到這里我就有新的解決思路到逊。
解決
因為swiftPM 能夠通過 Local 方式引入對應的 Package铣口。所以我下載了'web3swift'的源碼引入到項目中,然后修改了 'web3swift'的 Package.swift 文件改變了對 'secp256k1'引入方式觉壶。
/ swift-tools-version: 5.5.0
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "Web3swift",
platforms: [
.macOS(.v10_15), .iOS(.v13)
],
products: [
.library(name: "web3swift", targets: ["web3swift"])
],
dependencies: [
.package(url: "https://github.com/attaswift/BigInt.git", .upToNextMinor(from: "5.3.0")),
.package(url: "https://github.com/krzyzanowskim/CryptoSwift.git", .upToNextMinor(from: "1.5.1")),
.package(name: "secp256k1", url: "https://github.com/Boilertalk/secp256k1.swift.git", from: "0.1.7")
],
targets: [
.target(
name: "Web3Core",
dependencies: ["BigInt", "secp256k1", "CryptoSwift"]
),
.target(
name: "web3swift",
dependencies: ["Web3Core", "BigInt", "secp256k1"],
resources: [
.copy("./Browser/browser.js"),
.copy("./Browser/browser.min.js"),
.copy("./Browser/wk.bridge.min.js")
]
),
.testTarget(
name: "localTests",
dependencies: ["web3swift"],
path: "Tests/web3swiftTests/localTests",
resources: [
.copy("../../../TestToken/Helpers/SafeMath/SafeMath.sol"),
.copy("../../../TestToken/Helpers/TokenBasics/ERC20.sol"),
.copy("../../../TestToken/Helpers/TokenBasics/IERC20.sol"),
.copy("../../../TestToken/Token/Web3SwiftToken.sol")
]
),
.testTarget(
name: "remoteTests",
dependencies: ["web3swift"],
path: "Tests/web3swiftTests/remoteTests",
resources: [
.copy("../../../TestToken/Helpers/SafeMath/SafeMath.sol"),
.copy("../../../TestToken/Helpers/TokenBasics/ERC20.sol"),
.copy("../../../TestToken/Helpers/TokenBasics/IERC20.sol"),
.copy("../../../TestToken/Token/Web3SwiftToken.sol")
]
)
]
)
這樣web3swift
就不再提供 secp256k1
這個traget政敢,項目中也是共同使用同一個 secp256k1
的package了碎税。 最后我通過Local 方式引入了web3swift
沖突問題也不存在了。
moduleAliases
這個解決方式我沒使用到,如果有這方面的經(jīng)驗同學可以交流一下~