因为项目需要接入 Magic钱包,所以我开始接入在项目了MagicSDK,是通过 SwiftPM 的方式。接入过程中发现 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
可以看到是因为出现多个 targets named 为'secp256k1' 导致冲突了,首先我当前项目中通过 SwiftPM 引入了'web3swift',而web3swift 的Package文件中定义了一个Target名为 'secp256k1'。而现在我需要引入的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
参数这个解决方案我就为有尝试下去了。
我回去研究了web3swift
库对 secp256k1
的使用,发现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
这个解决方式我没使用到,如果有这方面的经验同学可以交流一下~