Exportando Package.swift para Swift Package Manager do projeto Xcode existente

Oct 03 2020

Estou trabalhando com o Xcode 11.3 no macOS Catalina 10.15.6.

Tenho um projeto Xcode existente que cria um aplicativo para iOS. Estou interessado em reutilizar algumas das classes em uma sessão interativa com o swiftinterpretador de linha de comando. As classes com as quais desejo trabalhar são classes de dados centrais que são geradas automaticamente a partir de um modelo de dados Xcode e também algumas classes que escrevi que funcionam com as classes de dados centrais. O aplicativo tem telas de IU e usa UIKit, mas não estou tentando usar nenhuma dessas classes; Espero poder compilar essas classes e não fazer referência a elas ou, de alguma forma, dizer ao Swift Package Manager para ignorar essas classes por completo.

O que eu acho que gostaria de fazer é exportar um Package.swift para o projeto Xcode existente, de modo que swift buildna linha de comando seria capaz de compilar todas as classes do projeto, ou, na falta disso, pelo menos as classes não UI , e então swift run --replseria capaz de carregar as classes via import.

Vejo um item de menu no Xcode para criar um novo pacote Swift, mas não para exportar um projeto existente. Existe uma maneira de exportar um projeto existente?

Respostas

1 iUrii Oct 07 2020 at 02:05

Não há um comando de menu ou utilitário para converter o aplicativo em uma biblioteca estática, estrutura dinâmica ou pacote rápido, uma vez que são diferentes tipos de projetos com diferentes configurações, etc.

Se você deseja exportar uma parte do seu projeto como um pacote rápido, você deve realizar as próximas etapas manualmente:

1. Crie o arquivo Package.swift na raiz do seu projeto

import PackageDescription

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

2. Crie uma pasta com subpasta ./Sources/MyLibna raiz dos projetos.

Por padrão, a estrutura de pacote rápida requer colocar todos os seus arquivos de origem em Códigos de origem / LibraryNamepasta, mas você pode alterá-lo abaixo.

NOTA: você pode simplificar as duas primeiras etapas usando swift package inite cria as pastas Package.swift, Sources e Test, etc.

3. Incluir arquivos de origem

a) Mova os arquivos necessários para compartilhar de seus locais atuais para a pasta MyLib.

Por exemplo:

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

Além disso, você deve atualizar os locais dos arquivos movidos em seu projeto Xcode para deixá-lo compilável.

b) Utilização path, sourcese excludeao ponto necessário arquivos de origem para o seu pacote de seus locais atuais:

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

NOTA: Não se esqueça de tornar suas aulas públicas para acessá-las após importar seu pacote:

public class MyEntity {
...
}

Afinal, você terá dois projetos funcionando - o antigo XCode e o novo pacote Swift.

4. REPL

Agora você pode usar o interpretador de linha de comando com seu pacote swift:

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