Swift Package Manager无法访问Sources下相邻文件夹及类问题咨询
问题解答
1. 配置错误说明
你当前的问题分为两处:
- 类访问等级错误:你只给
Apple类的属性、方法、初始化方法标记了public,但类本身没有添加public修饰符,Swift中类默认访问等级为internal,仅当前模块可访问,外部模块(包括同包下的其他target、宿主程序)都无法访问。 - 包清单依赖缺失:你当前定义了两个完全独立的target
RicPackage和Apple,互相没有依赖关系,所以RicPackage内无法直接访问Apple的代码;如果测试代码需要访问Apple,也需要在测试target的依赖中添加Apple。
修正代码示例
Apple.swift 修正
import Foundation // 类本身必须添加public修饰符,对外暴露 public class Apple { public private(set) var text = "Hello from Apple!" public init() { } public func eat() -> String { print("Inside Eat Apple") return "Hello from Eat Apple." } }
Package.swift 修正(支持跨target访问)
// swift-tools-version:5.5 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription let package = Package( name: "RicPackage", products: [ .library( name: "RicPackage", targets: ["RicPackage"]), .library( name: "Apple", targets: ["Apple"]), ], targets: [ .target( name: "RicPackage", // 给RicPackage添加对Apple的依赖,即可在RicPackage内访问Apple的公开接口 dependencies: ["Apple"]), .target( name: "Apple", dependencies: []), .testTarget( name: "RicPackageTests", // 测试需要访问Apple的话也要添加对应依赖 dependencies: ["RicPackage", "Apple"]), ] )
额外说明:如果你不需要将Apple作为独立库对外提供,完全可以把Apple相关文件放到Sources/RicPackage目录下,不需要单独拆分为target,RicPackage和宿主程序都能直接访问公开的Apple类,不需要额外配置依赖。
2. target与文件夹命名规则
- 默认规则下,SPM会自动查找
Sources目录下和target同名的文件夹作为该target的源码根目录,比如名为Apple的target,默认读取Sources/Apple下的所有Swift文件,根目录下的文件不需要和target同名,你可以命名为Fruit.swift、Apple+Extension.swift等都可以正常编译。 - 如果你不想遵循默认的目录命名规则,可以在target配置中添加
path参数自定义源码路径,例如:.target( name: "Apple", dependencies: [], path: "Sources/CustomAppleFolder" // 自定义源码路径,不需要和target同名 )
内容的提问来源于stack exchange,提问作者Frederick C. Lee
相关产品推荐
相关产品推荐

