问题描述
我正在macOS Catalina 10.15.6上使用Xcode 11.3。
我有一个现有的Xcode项目,该项目为iOS构建了一个应用程序。我对在使用swift
命令行解释器的交互式会话中重用某些类感兴趣。我要使用的类是从Xcode数据模型自动生成的Core Data类,以及我编写的与Core Data类一起使用的一些类。该应用程序具有UI屏幕,并使用UIKit,但我不尝试使用任何此类。我希望我可以编译那些类,然后不引用它们,或者以某种方式告诉Swift Package Manager完全忽略那些类。
我想我想做的是为现有Xcode项目导出Package.swift,这样在命令行上的swift build
将能够编译所有项目类,否则将导致编译失败。 ,至少是非UI类,然后swift run --repl
可以通过import
加载这些类。
我在Xcode中看到一个菜单项,用于创建新的Swift程序包,但未导出现有项目。有没有办法导出现有项目?
解决方法
没有菜单命令或实用程序可将应用程序转换为静态库,动态框架或快速包,因为它们是具有不同设置等的不同类型的项目。
如果要将项目的一部分导出为快速包,则应手动进行下一步:
1。在项目的根目录中创建Package.swift文件
import PackageDescription
let package = Package(
name: “MyLib”,products: [
.library(name: "MyLib",targets: ["MyLib"])
],targets: [
.target(name: "MyLib"),],...
)
2。在项目根目录下的子文件夹./Sources/MyLib
中创建文件夹。
默认情况下,快速包结构要求将所有源文件都放在Sources / LibraryName
文件夹下,但您可以在下面进行更改。
注意:您可以使用swift package init
简化前两个步骤,并创建Package.swift,Sources和Test文件夹等。
3。包括源文件
a)将所需文件从当前位置共享到MyLib文件夹中。
例如:
./Classes/MyEntity.swift -> ./Sources/MyLib/MyEntity.swift
此外,您还必须更新Xcode项目中已移动文件的位置,以使其可编译。
b)使用path
,sources
和exclude
将所需的源文件从它们的当前位置指向您的软件包:
.target(name: "MyLib",path: "Classes"),
注意:导入包后,别忘了公开您的班级以访问它们:
public class MyEntity {
...
}
毕竟,您将有两个可用的项目-旧的XCode的一个项目和新的Swift软件包。
4。 REPL
现在,您可以在swift软件包中使用命令行解释器了:
swift run --repl
import MyLib
let entity = MyEntity()
...