본문 바로가기

프로그래밍/iOS,macOS

SPM Package.swift 관련 요소 목록

 

로지컬한 내용이 아닌데다 대부분 기본적인 요소만 사용하기에 세부적인 항목에 대해선 그리 신경을 쓰진 않았는데, 프리빌드로 swift 파일이나 데이터를 검토, 생성하는 등의 작업에는 이해하고 있어야 하는 부분들이 생겼다.

일단 세부 내용은 애플 문서에 잘 나와있긴한데, 내부에 정의되는 항목들과 파라미터들이 어떤 녀석들인지 인지하기위해 전체적으로 항목들을 나열해 둔다.

 


참고사항

패키지 초기화

swift package init --type library

 

 

sample/ 폴더에서 초기화를 하니 패키지명과 프로덕트, 타겟이 루트폴더명으로 설정된다.

 

Sources/sample/sample.swift

Tests/sampleTests/sampleTests.swift

Package.swift

 

 

Package.swift 의 첫 라인은 버전을 표시하는데, 호환성을 위해 해당 라인을 필수로 포함해야 한다.

swift package init 명령을 사용하지 않는다면, Package.swift 를 아래처럼 생성해주면 된다.

// swift-tools-version: 6.2

import PackageDescription

let package = Package(
    name: "MyPackage"
)

 

 

xcode 열기

open Package.swift

 

 


Package

https://developer.apple.com/documentation/packagedescription/package

 

Package | Apple Developer Documentation

The configuration of a Swift package.

developer.apple.com

 

패키지를 생성한다. 아래 생성자 외에도 5개 정도 생성자가 추가로 있음.

Package(
  name: String,
  defaultLocalization: LanguageTag? = nil,
  paltforms: [SupportedPlatform]? = nil,
  pkgConfig: String? = nil,
  providers: [SystemPackageProvider]? = nil,
  products: [Product] = [],
  dependencies: [Package.Dependency] = [],
  targets: [Target] = [],
  swiftLanguageModes: [SwiftLanguageMode]? = nil,
  cLanguageStandard: CLanguageStandard? = nil,
  cxxLanguageStandard: CXXLanguageStandard? = nil
)

// swift 6.1 : traits 항목 추가

 

SupportedPlatform

.iOS(SupportedPlatform.IOSVersion)
.iOS(String)
.iOS
.macOS(SupportedPlatform.MacOSVersion)
.macOS(String)
.macOS
// 기타 watchOS, visionOS, tvOS, macCatalyst, driverKit

 

 

SystemPackageProvider

.apt([String])
.brew([String])
.nuget([String])
.yum([String])

 

 

Dependency

.package(url: String, from: Version)
.package(url: String, Range<Version>)
.package(url: String, ClosedRange<Version>)
.package(url: String, branch: String)
.package(url: String, revision: String)
.package(url: String, exact: String)
.package(id: String, from: Version)
.package(id: String, Range<Version>)
.package(id: String, ClosedRange<Version>)
.package(id: String, exact: String)
.package(name: String, path: String)

// swift 6.1
// 위 항목 모두 traits: Set<Package.Dependency.Trait> 으로 조건 지정 가능

 

 

SwiftLanguageMode

case v6
case v5
case v4_2
case v4
case version(String)

 


Target

https://developer.apple.com/documentation/packagedescription/target

 

Target | Apple Developer Documentation

The basic building block of a Swift package.

developer.apple.com

 

Target은 빌드 단위로서 이 패키지에 포함될 모듈이나 실행파일, 테스트 모듈등이 된다.
소스파일의 경로와 빌드 관련 설정, 컴파일러을 위한 플러그인, 매크로 등을 정의한다.

 

target

별도의 path 설정이 없으면 Sources/target-name/ 하위의 소스코드를 빌드

.target(
  name: String,
  dependencies: [Target.Dependency],
  
  // 파일 위치 관련 설정
  path: String?,
  exclude: [String],
  sources: [String]?,
  resources: [Resource]?
  publicHeaderPath: String?,
  
  // 컴파일 관련 설정
  cSettings: [CSetting]?,
  cxxSettings: [CXXSetting]?,
  swiftSettings: [SwiftSetting]?,
  linkerSettings: [LinkerSetting]?,
  plugins: [Target.PluginUsage]?
)

 

 

path 

설정하지 않으면 Sources/target-name 이 기본 소스 위치로 지정된다.

c/c++의 경우 헤더파일은 타겟 폴더의 include 로 지정된다. 변경하려면 cSettings, cxxSettings 에서 폴더를 지정.

// 타겟 소스 위치
MyPackage/Sources/MyLibrary

// c/c++ 타겟의 헤더 위치
MyPackage/Sources/CMyLibrary/include

 

 

Dependency

.product(
  name: String,
  package: String,
  moduleAliases: [String: String]?,
  condition: TargetDependencyCondition?
)

.target(
  name: String,
  condition: TargetDependencyCondition?
)

.byName(
  name: String,
  condition: TargetDependencyCondition?
)

 

 

Resource

.process(String, localization: Resource.Localization?)
.copy(String)
.embedInCode(String

process 는 번들 루트에 해당 리소스를 위치시키고, copy는 디렉토리 구조를 유지한채 번들링을 수행

 

 

 

 

CSetting, CXXSetting

.define(String, to: String?, BuildSettingCondition?)
.headerSeachPath(String, BuildSettingCondition?)
.unsafeFlags([String], BuildSettingCondition?)
.disableWarning(String, BuildSettingCondition?)
.enableWarning(String, BuildSettingCondition?)
.treatAllWarnings(as: WarningLevel, BuildSettingCondition?)
.treatWarning(String, as: WarningLevel, BuildSettingCondition?)

 

ex) 타겟내의 C 헤더 파일 위치를 변경하려면

cSettings: [
  .headerSearchPath("MyPublicHeaders")
]

 

 

SwiftSetting

.define(String, BuildSettingCondition?)
.unsafeFlags([String], BuildSettingCondition?)
.strictMemorySafety(BuildSettingCondition?)
.swiftLanguageMode(SwiftLanguageMode, BuildSettingCondition?)
.defaultIsolation(MainActor.Type?, BuildSettingCondition?)
.enableExperimentalFeature(String, BuildSettingCondition?)
.enableUpcomingFeature(String, BuildSettingCondition?)
.interoperabilityMode(SwiftSetting.InteroperabilityMode, BuildSettingCondition?)
.treatAllWarnings(as: WarningLevel, BuildSettingCondition?)
.treatWarning(String, as: WarningLevel, BuildSettingCondition?)

 

 

executableTarget

실행 가능한 모듈

포함할 내용은 target과 동일

.executableTarget(
  name: String,
  dependencies: [Target.Dependency],
  path: String?,
  exclude: [String],
  sources: [String]?,
  resources: [Resource]?,
  publicHeadersPath: String?,
  packageAccess: Bool,
  cSettings: [CSetting]?,
  cxxSettings: [CXXSetting]?,
  swiftSettings: [SwiftSetting]?,
  linkerSettings: [LinkerSetting]?,
  plugins: [Target.PluginUsage]?
)

 

 

plugin

플러그인은 path 가 지정되지 않으면 Plugins/plugin-name/ 의 소스 빌드 

.plugin(
  name: String,
  capability: Target.PluginCapability,
  dependencies: [Target.Dependency],
  path: String?,
  exclude: [String],
  sources: [String]?,
  packageAccess: Bool
)

 

PluginCapability

.buildTool()
.command(intent: PluginCommandIntent, permissions: [PluginPermission])

 

 

binaryTarget

이미 빌드되어있는 xcframework 같은 바이너리를 포함하는 경우

.binaryTarget(
  name: String,
  path: String
)

 

 

systemLibraryTarget

시스템에 설치된 라이브러리를 사용하는 경우

.systemLibrary(
  name: String,
  path: String?,
  pkgConfig: String?,
  providers:[SystemPackageProvider]?
)

 

 


Product

https://developer.apple.com/documentation/packagedescription/product

 

Product | Apple Developer Documentation

The object that defines a package product.

developer.apple.com

 

Product는 외부에서 사용 가능한 요소들을 정의한다.

 

libray

정적, 동적 라이브러리

.library(
  name: String,
  type: Product.Library.LibraryType?,
  targets: [String]
)

 

LibraryType

case dynamic
case 'static'

 

 

executable

실행 도구

.executable(
  name: String,
  targets: [String]
)

 

 

plugin

빌드 프로세스에 실행되는 도구

.plugin(
  name: String,
  targets: [String]
)