it-source

프로젝트의 여러 대상 및 플랫폼에 대한 Swift Package 소비?

criticalcode 2023. 9. 23. 22:47
반응형

프로젝트의 여러 대상 및 플랫폼에 대한 Swift Package 소비?

iOS 앱, 시계 등 여러 대상을 가진 프로젝트가 있습니다.OS 앱, 그리고 몇 가지 프레임워크.내가 원하는 모든 대상에 동일한 Swift Package를 할당하려면 어떻게 해야 합니까?Xcode만 선택할 수 있습니다.

SPM1

Swift Package를 다시 추가하여 프로젝트의 다른 대상에 할당하려고 하면 오류가 발생합니다.

SPM2

이것을 하는 올바른 방법은 무엇입니까?아래는 스위프트 패키지의 패키지 매니페스트입니다.그 쪽에서 해야 할 일이나 Xcode에서 제가 해야 할 일이 있나요?

import PackageDescription

let package = Package(
    name: "Alamofire",
    platforms: [
        .macOS(.v10_12),
        .iOS(.v10),
        .tvOS(.v10),
        .watchOS(.v3)
    ],
    products: [
        .library(
            name: "Alamofire",
            targets: ["Alamofire"])
    ],
    targets: [
        .target(
            name: "Alamofire",
            path: "Source")
    ],
    swiftLanguageVersions: [.v5]
)

저도 같은 문제가 있었는데, 이 두 가지 해결책만 발견했습니다.

먼저 첫 번째 대상에 패키지를 추가합니다.

Add package

그런 다음 첫 번째 옵션이 다른 대상인 General(일반) 탭으로 이동하고 Frameworks(프레임워크), Libraries(라이브러리) 및 Embedded Content(임베디드 콘텐츠)에서 +를 누른 다음 패키지를 선택하고 Add(추가)를 누릅니다.

Adding package in General tab

다른 옵션은 위상을 구축하고 라이브러리와 이진 연결에서 비슷한 방식을 반복하는 것입니다.

Build Phases

Select package

저는 현재 이 옵션만 알고 있습니다. 예를 들어 애플이 멀티체크로 이를 개선할 수 있기를 바랍니다.

디에고 카레라가 제공한 솔루션 외에도 프레임워크 대화 상자의 모든 대상이 패키지를 사용할 수 있도록 신속한 패키지 캐시를 재설정해야 했습니다.

Xcode:파일 -> Swift Packages -> 패키지 캐시 재설정

크리에이티브 코딩이라는 iOS Target과 mandelbrot라는 Mac 명령줄 Target이 포함된 프로젝트에 새로운 Numerics 패키지를 추가하려고 할 때도 같은 문제가 발생했습니다.

저는 첫 번째 타겟에 Xcode의 일반적인 방식으로 패키지를 추가했습니다.그런 다음 Xcode를 그만두고 편집기에서 project.pbxproj 파일을 열었습니다(물론 vi.그런 다음 / Begin PBXNativeTarget 섹션 / comment로 내려가 CreativeCoding 대상을 찾아 새로운 Numerics 패키지(Numerics, ComplexModule, RealModule)가 포함된 PackageProductDependency 컨테이너에서 3줄을 복사하여 mandelbrot 명령줄 대상의 PackageProductDependency 컨테이너에 붙여넣었습니다.

/* Begin PBXNativeTarget section */
            8B083F4B24F0B40000A225C8 /* CreativeCoding */ = {
                    isa = PBXNativeTarget;
                    buildConfigurationList = 8B083F6024F0B40200A225C8 /* Build configuration list for PBXNativeTarget "CreativeCoding" */;
                    buildPhases = (
                            8B083F4824F0B40000A225C8 /* Sources */,
                            8B083F4924F0B40000A225C8 /* Frameworks */,
                            8B083F4A24F0B40000A225C8 /* Resources */,
                    );
                    buildRules = (
                    );
                    dependencies = (
                    );
                    name = CreativeCoding;
                    packageProductDependencies = (
                            8B22BD29263E328B00867530 /* ComplexModule */,
                            8B22BD2B263E328B00867530 /* RealModule */,
                            8B22BD2D263E328B00867530 /* Numerics */,
                    );
                    productName = CreativeCoding;
                    productReference = 8B083F4C24F0B40000A225C8 /* CreativeCoding.app */;
                    productType = "com.apple.product-type.application";
            };
            8BE83F4F26213D1C00663AC9 /* mandelbrot */ = {
                    isa = PBXNativeTarget;
                    buildConfigurationList = 8BE83F5626213D1D00663AC9 /* Build configuration list for PBXNativeTarget "mandelbrot" */;
                    buildPhases = (
                            8BE83F4C26213D1C00663AC9 /* Sources */,
                            8BE83F4D26213D1C00663AC9 /* Frameworks */,
                            8BE83F4E26213D1C00663AC9 /* CopyFiles */,
                    );
                    buildRules = (
                    );
                    dependencies = (
                    );
                    name = mandelbrot;
                    packageProductDependencies = (
                            8BB120942622CCB8008EDAB0 /* ArgumentParser */,
                            8B22BD29263E328B00867530 /* ComplexModule */,
                            8B22BD2B263E328B00867530 /* RealModule */,
                            8B22BD2D263E328B00867530 /* Numerics */,
                    );
                    productName = mandlebrot;

제가 방금 3개의 새로운 라인을 추가한 두 번째 대상에 이미 ArgumentParser 패키지를 가지고 있었기 때문에 저는 조금 더 쉬웠을 수도 있습니다.그러나 동일한 작업을 수행하여 두 번째 대상에 임시 패키지를 추가할 수 있습니다.

그런 다음 Xcode로 들어가 정상처럼 두 개의 목표물을 구축했고 작동했습니다.

저에게는 Xcode 14.2 버전이었습니다.대상에 추가하고 싶은 프레임워크가 보이지 않았는데 최신 Xcode 14.3.1로 업데이트하여 문제가 해결되었습니다.두 번째 타겟에 추가하고 싶은 스위프트 패키지를 볼 수 있었고 성공적으로 추가했습니다.

Diego의 답변 https://stackoverflow.com/a/58079416/2929892 을 사용하여 누락된 프레임워크를 추가했습니다.

종속성을 추가한 후 새 대상을 추가하면 프로젝트에서 종속성을 제거한 다음 다시 추가해야 합니다.그렇지 않으면 라이브러리가 프레임워크 선택자에 나타나지 않습니다.

Xcode가 Swift Package Manager에서 할 수 있는 신뢰할 수 있는 한 가지 일은 저에게 충돌입니다.따라서 프로젝트를 열기만 하면 Xcode가 크래시 되는 상태가 될 수 있으므로 프로젝트 백업을 반드시 준비해야 합니다.

Xcode 12에서는 두 번째 대상을 선택하고 의존성(swift package)을 추가하기만 하면 됩니다.

언급URL : https://stackoverflow.com/questions/57625952/consume-swift-package-for-multiple-targets-and-platforms-in-a-project

반응형