尝试使用多个swift软件包管理器目标中定义的同一类/结构时出错

尝试使用多个swift软件包管理器目标中定义的同一类/结构时出错,swift,swift-package-manager,Swift,Swift Package Manager,我想给不同SPM目标中定义的类或结构赋予相同的名称,但我得到以下错误: MyModel在MyLibraryTargetOne和MyLibraryTargetTwo 这是我的SPM清单 //swift工具版本:5.3 //swift工具版本声明了构建此软件包所需的swift最低版本。 导入包说明 让包=包( 名称:“我的图书馆”, 产品:[ //产品定义一个包产生的可执行文件和库,并使它们对其他包可见。 .图书馆( 名称:“我的图书馆”, 目标:[“MyLibrary”] ), .图书馆(

我想给不同SPM目标中定义的
结构
赋予相同的名称,但我得到以下错误:

MyModel
MyLibraryTargetOne
MyLibraryTargetTwo

这是我的SPM清单


//swift工具版本:5.3
//swift工具版本声明了构建此软件包所需的swift最低版本。
导入包说明
让包=包(
名称:“我的图书馆”,
产品:[
//产品定义一个包产生的可执行文件和库,并使它们对其他包可见。
.图书馆(
名称:“我的图书馆”,
目标:[“MyLibrary”]
),
.图书馆(
名称:“MyLibraryTargetOne”,
目标:[“MyLibraryTargetOne”]
),
.图书馆(
名称:“MyLibraryTargetTwo”,
目标:[“MyLibraryTargetTwo”]
),
],
依赖项:[
//依赖项声明此包所依赖的其他包。
//.package(url:/*package url*/,from:“1.0.0”),
],
目标:[
//目标是包的基本构建块。目标可以定义模块或测试套件。
//目标可以依赖于此包中的其他目标,也可以依赖于此包所依赖的包中的产品。
.目标(
名称:“我的图书馆”,
依赖项:[“MyLibraryTargetOne”、“MyLibraryTargetTwo”]
),
.目标(
名称:“MyLibraryTargetOne”,
依赖项:[“MyLibraryCore”]
),
.目标(
名称:“MyLibraryTargetTwo”,
依赖项:[“MyLibraryCore”]
),
.目标(
名称:“MyLibraryCore”,
依赖项:[]
), 
.testTarget(
名称:“MyLibraryTest”,
依赖项:[“MyLibrary”]
),
]
)

我是做错了还是不受支持?

我试图重现您的问题,但失败了——这实际上是一件好事,因为这意味着有一个可以修复的错误;)

我在Xcode中创建了一个包项目,它是一个包含两个其他库的库产品。文件结构如下所示:

Package.swift文件:

// swift-tools-version:5.3
import PackageDescription

let package = Package(
    name: "MyLibrary",
    products: [
        .library(name: "MyLibrary", targets: ["MyLibrary"]),
        .library(name: "LibraryA", targets: ["LibraryA"]),
        .library(name: "LibraryB", targets: ["LibraryB"]),
    ],
    dependencies: [],
    targets: [
        .target(name: "MyLibrary",dependencies: ["LibraryA", "LibraryB"]),
        .target(name: "LibraryA",dependencies: []),
        .target(name: "LibraryB",dependencies: []),
        .testTarget(
            name: "MyLibraryTests",
            dependencies: ["MyLibrary"]),
    ]
)
这里是我图书馆的Swift文件:

import LibraryA
import LibraryB

public struct MyModel {
    public let a: LibraryA.MyModel
    public let b: LibraryB.MyModel

    public init(a: LibraryA.MyModel, b: LibraryB.MyModel) {
        self.a = a
        self.b = b
    }
}
库A/B文件:

public struct MyModel {
    public init() {}
}
XCTest文件:

import XCTest
import LibraryB
import LibraryA
import MyLibrary

final class MyLibraryTests: XCTestCase {
    func testExample() {
        _ = MyModel(a: LibraryA.MyModel(), b: LibraryB.MyModel())
    }
}

一切都按预期进行编译和链接。

乍一看,它应该编译。您可以检查是否已将
init
公开-但我意识到这会产生另一个错误。清除模块缓存?所有
init
都是公共的,并且清除模块缓存时没有运气:(这正是我所做的,但我仍然无法编译,我将在新项目中重试。thxI发现了问题,在LibraryA/B目标中,我还有一个名为LibraryA/B的结构,编译器无法推断“类型”@Batti是的,这实际上是一个问题:当您的模块名为“Foo”,并且您有另一个名为“Foo”的枚举、结构、类等,那么即使在同一个库中,编译器也无法解析限定访问。例如,当您必须消除自由函数
Foo()的歧义时
您将使用
Foo.Foo()
——其中“Foo”是模块名——但编译器会抱怨结构“Foo”没有成员“Foo()”。