Exportando Package.swift para Swift Package Manager desde un proyecto Xcode existente

Oct 03 2020

Estoy trabajando con Xcode 11.3 en macOS Catalina 10.15.6.

Tengo un proyecto de Xcode existente que crea una aplicación para iOS. Estoy interesado en reutilizar algunas de las clases en una sesión interactiva con el swiftintérprete de línea de comandos. Las clases con las que quiero trabajar son clases Core Data que se generan automáticamente a partir de un modelo de datos Xcode y también algunas clases que he escrito que funcionan con las clases Core Data. La aplicación tiene pantallas de interfaz de usuario y hace uso de UIKit, pero no estoy tratando de usar ninguna de esas clases; Espero poder compilar esas clases y luego no hacer referencia a ellas, o decirle a Swift Package Manager que ignore esas clases por completo.

Lo que creo que me gustaría hacer es exportar un Package.swift para el proyecto Xcode existente, de modo que swift builden la línea de comando pueda compilar todas las clases del proyecto o, en su defecto, al menos las clases que no son de interfaz de usuario , y luego swift run --replpodría cargar las clases a través de import.

Veo un elemento de menú en Xcode para crear un nuevo paquete Swift, pero no para exportar un proyecto existente. ¿Existe alguna forma de exportar un proyecto existente?

Respuestas

1 iUrii Oct 07 2020 at 02:05

No hay un comando de menú o una utilidad para convertir la aplicación en una biblioteca estática, marco dinámico o paquete rápido, ya que son diferentes tipos de proyectos con diferentes configuraciones, etc.

Si desea exportar una parte de su proyecto como un paquete rápido, debe realizar los siguientes pasos manualmente:

1. Cree el archivo Package.swift en la raíz de su proyecto

import PackageDescription

let package = Package(
    name: “MyLib”,
    products: [
        .library(name: "MyLib", targets: ["MyLib"])
    ],
    targets: [
        .target(name: "MyLib"),
    ],
    ...
)

2. Cree una carpeta con una subcarpeta ./Sources/MyLibdebajo de la raíz del proyecto.

Por defecto, la estructura del paquete rápido requiere poner todos sus archivos de origen en la LibraryNamecarpeta Fuentes /, pero puede cambiarlo a continuación.

NOTA: puede simplificar los dos primeros pasos utilizando swift package inity crea carpetas Package.swift, Sources y Test, etc.

3. Incluir archivos de origen

a) Mueva los archivos necesarios para compartir desde sus ubicaciones actuales a la carpeta MyLib.

Por ejemplo:

./Classes/MyEntity.swift -> ./Sources/MyLib/MyEntity.swift

También debe actualizar las ubicaciones de los archivos movidos en su proyecto Xcode para dejarlo compilable.

b) Uso path, sourcesy excludepara señalar necesaria archivos de origen a su paquete de sus ubicaciones actuales:

.target(name: "MyLib", path: "Classes"),

NOTA: No olvide hacer públicas sus clases para acceder a ellas después de importar su paquete:

public class MyEntity {
...
}

Después de todo, tendrá dos proyectos en funcionamiento: el antiguo paquete de XCode y el nuevo Swift.

4. REPL

Ahora puede usar el intérprete de línea de comandos con su paquete rápido:

swift run --repl
import MyLib
let entity = MyEntity()
...