Estou construindo um pacote que contém muitas classes, extensões e módulos que venho construindo desde que comecei a desenvolver para iOS em 2008.
Como também desenvolvo para macOS, watchOS, iPadOS e tvOS, este pacote possui código para todos os tipos ou dispositivos Apple.
Neste pacote em particular, tenho coisas para iOS e tvOS.
O pacote é declarado como:
import PackageDescription
let package = Package(
name: "MyPackage",
platforms: [.iOS(.v16), .tvOS(.v13)],
products: [
// Products define the executables and libraries a package produces, making them visible to other packages.
.library(
name: "MyPackage",
targets: ["MyPackage"]),
],
targets: [
.target(name: "MyPackage"),
.testTarget(name: "MyPackageTests", dependencies: ["MyPackage"])
]
)
Importei este pacote para um projeto que tem dois destinos, um para iOS e outro para watchOS porque quero usar o material que ele contém para iOS no destino iOS.
Agora estou depurando o destino iOS. Mesmo assim, o Xcode apresenta muitos erros, pois está tentando compilar o pacote no destino watchOS.
Isso me obriga a adicionar #if !os("watchOS)
e #endif
em cada arquivo o pacote tem que isolar o código e evitar que ele seja compilado pelo Xcode para o destino watchOS. Isso é muito estúpido porque o pacote é declarado assim:
platforms: [.iOS(.v16), .tvOS(.v13)],
E porque o pacote acabou de ser adicionado para o destino iOS.
Existe alguma maneira de fazer o Xcode funcionar conforme o esperado e não compilar um pacote para um destino para o qual não foi declarado?
Não incluir uma plataforma significa que o pacote suporta a versão padrão dessa plataforma :
Não há como expressar "não suporta plataforma Apple" no SPM. Você pode expressar "não disponível para uma plataforma" com
@available
, mas o código ainda precisa ser compilado, o que geralmente significa adicionar#if
testes.Observe que isso
#if !os(watchOS)
significa que ele é compilado para visionOS. Sempre que surge uma nova plataforma, ela é automaticamente suportada por todos os pacotes.