- Published on
๐ Swift - Package
- Authors
- Name
- ์ด์ฐฝ์ค
Package (ํจํค์ง)
ํจํค์ง๋ ํ๋ก์ ํธ ๋ด์์ ์ฌ์ฉํ๋ ์ฝ๋/๋ฆฌ์์ค๋ค์ ์ฌ์ฌ์ฉํ๊ธฐ ์ฝ๋๋ก ๋ฌถ์ด ์ ๋ํ๊ฑฐ๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ ์ปค๋ฎค๋ํฐ์ ๊ณต์ ํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ ๋๋ค.
Xcode๋ ์ด๋ฐ ํจํค์ง ๊ธฐ๋ฅ์ Swift Package Manager๋ฅผ ํตํด ์ฝ๊ณ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํ๊ณ ์์ต๋๋ค.
๋ค ๋ง์์..
์ ํฌ๊ฐ ๋งจ๋ ์ฐ๋ ๊ทธ๊ฑฐ์..
๊ทธ๋ฌ๋ฉด ๋ฉ์๊ณ ํ๋ คํ RxSwift์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์์ํด๋ณด์ฃ ?
Swift Package ๋ง๋ค๊ธฐ
์ ๋ฐ์ ์ธ ํจํค์ง ์์ฑ ๊ณผ์
ํจํค์ง ๋ง๋ค๊ธฐ ์ ๋ง ์ฝ์ต๋๋ค.
Xcode์ ๋ฉ๋ด์์ File โก๏ธ New โก๏ธ Package
๋ฅผ ๋๋ฌ์ค์๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ ํ๋ก์ ํธ๋ ํ์ผ์ ๋ง๋๋ ๊ฒ๊ณผ ๊ฐ์ด ํจํค์ง๋ฅผ ์์ฑํ๋ ์ฐฝ์ด ๋ณด์ ๋๋ค.
์ ๋ Favor ํ๋ก์ ํธ์ ํจํค์ง๋ฅผ ์ ์ฉํ๊ธฐ ์ํด Add to์ Group๋ ์ค์ ํด์ฃผ์์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ๋น์ด์๋ ํจํค์ง ๋ง๋ค๊ธฐ ๋์ ๋๋ค.
ํจํค์ง๋ฅผ ์์ฑํ๋ฉด ์ด๋ฐ ๊ตฌ์กฐ์ ํ์ผ๋ค์ด ํ๋ก์ ํธ์ ์ถ๊ฐ๋ฉ๋๋ค. ๊ฐ๊ฐ์ ํ ๋ฒ ์์๋ณผ๊น์?
- README.md
๋ญ ์ค๋ช ํ ๊ฒ๋ ์์ฃ . ํจํค์ง์ ๋ํ ์ค๋ช ์ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
- Package.swift
ํํ๋ค manifest๋ผ๊ณ ๋ถ๋ฅด๋ ํจํค์ง์ ๋ํ ์ ๋ณด๊ฐ ๋ด๊ธด ํ์ผ์ ๋๋ค. ์ด ํ์ผ ์์์ ํจํค์ง์ name, products, targets, dependencies๋ค์ ์ค์ ํด์ฃผ๊ฒ ๋ฉ๋๋ค.
- Sources
์์ค ํ์ผ๋ค์ ์ด Sources ๋๋ ํ ๋ฆฌ ๋ด๋ถ์ ์์นํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Target์ด๋ผ๋ ํ๋์ ์ด๋ฆ ์์ ๊ด๋ฆฌ๋ฉ๋๋ค.
- Tests
ํจํค์ง์ ๋ํ Unit Test ์ฝ๋๋ค์ด ์ฌ๊ธฐ์ ํด๋น๋ฉ๋๋ค.
Package.swift ์์ฑ
Favor ํ๋ก์ ํธ๋ ์ธ๊ฐ์ง ํจํค์ง๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๊ธฐ๋ก ํ์ต๋๋ค.
- FavorCoreKit
Foundation
์ extension
๋ค, OS์ ๋ฐ์ ํ๊ฒ ๋ฟ์์๋ ๊ธฐ๋ฅ๋ค (PhotosUI
, CoreGraphics
๋ฑ)์ ๋ด์๋ก๋๋ค. ๋ณดํต BaseViewController
์ ๊ฐ์ Base
ํ์ผ๋ค๋ ์ฌ๊ธฐ์ ๋ด๊ธด๋ค๊ณ ํ๋๋ฐ ์์ง ์ ํฌ ํ๋ก์ ํธ๋ ์ด๋ฐ ํ์ผ๋ค์ด ๋ง์ง ์์์ (BaseVC
ํ๋) ์ถ๊ฐ์ ์ธ ํ์๋ฅผ ํตํด ๊ฒฐ์ ํ๊ธฐ๋ก ํ์ต๋๋ค.
- FavorUIKit
UIKit
์ extension
๋ค๊ณผ ์ปค์คํ
UI ์ปดํฌ๋ํธ๋ค, ํฐํธ์ ์์ด์ฝ ๊ฐ์ Resources๋ค๊ณผ UI์ ์ฌ์ฉ๋๋ ์์ ํ์ผ๋ค์ด ํฌํฉ๋ฉ๋๋ค.
- FavorNetworkKit
HTTP ํต์ ๊ณผ ๊ฐ์ ๋คํธ์ํฌ ์์
์ ํ์ํ ํ์ผ๋ค์ด ๋ชจ๋ ํฌํจ๋ฉ๋๋ค. ์ ํฌ ํ๋ก์ ํธ๋ Moya
๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ BaseTargetType
๊ณผ API
ํ์ผ๋ค์ ์ฌ๊ธฐ์ ๋ฃ์ด์ฃผ์์ต๋๋ค.
์ด ์ค์์ FavorUIKit์ ํ ๋ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
// swift-tools-version: 5.7
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "FavorUIKit",
platforms: [
.iOS(.v15)
],
products: [
// Products define the executables and libraries a package produces, and make them visible to other packages.
.library(
name: "FavorUIKit",
targets: ["FavorUIKit"]),
],
dependencies: [
// Dependencies declare other packages that this package depends on.
// .package(url: /* package url */, from: "1.0.0"),
.package(url: "https://github.com/ReactiveX/RxSwift.git", .upToNextMajor(from: "6.5.0")),
.package(url: "https://github.com/SnapKit/SnapKit.git", .upToNextMajor(from: "5.6.0")),
.package(path: "../FavorCoreKit")
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages this package depends on.
.target(
name: "FavorUIKit",
dependencies: [
"RxSwift",
.product(name: "RxCocoa", package: "RxSwift"),
"SnapKit",
"FavorCoreKit"
],
resources: [
.process("Resources")
]
),
.testTarget(
name: "FavorUIKitTests",
dependencies: ["FavorUIKit"]),
]
)
- name
name
์ ๋ง ๊ทธ๋๋ก ํจํค์ง์ ์ด๋ฆ์
๋๋ค.
- platforms
platforms
๋ ํจํค์ง๊ฐ ์ฌ์ฉ๋ ์ ์๋ ํ๋ซํผ์ ๋ช
์ํด๋ก๋๋ค. .iOS
, .macOS
์ ๊ฐ์ ํ๋ซํผ case
์ .v15
์ ๊ฐ์ ๋ฒ์ case
๋ฅผ ๋ฃ์ด ์ ์ฉํ ์ ์์ต๋๋ค.
- products
products
๋ ํจํค์ง๊ฐ ์ ๊ณตํ๋ ํ๋ก๋์ธ ๋ค์ ๋ช
์ํ๋ ๊ณณ์
๋๋ค. .library
์ธ์๋ .executable
, .plugin
๊ณผ ๊ฐ์ case
๋ ์์ต๋๋ค.
ํ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ๋ฌ๊ฐ์ targets๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค. ๋ํ์ ์ผ๋ก RxSwift์ ๊ฒฝ์ฐ RxSwift ํ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ RxRelay, RxCocoa ๋ฑ์ ์ฌ๋ฌ ํ๊ฒ๋ค์ ์ ๊ณตํ๊ณ ์์ฃ .
- dependencies
ํจํค์ง๊ฐ ์ฌ์ฉํ๋ ๋ค๋ฅธ ํจํค์ง๋ค์ ๋ช ์ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ ํ ๋ด์ฉ์ ๋ณดํต ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฆฌ๋๋ฏธ ํ์ผ์ ์ ์ด๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ ์ฐธ๊ณ ํ์ฌ ์ ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
๊นํ๋ธ์ ์ฌ๋ผ์์๋ ํจํค์ง์ ๊ฒฝ์ฐ .package(url:)
์ ์ฌ์ฉํด์ฃผ๋ฉด ๋๊ณ , ๋ก์ปฌ ํจํค์ง์ ๊ฒฝ์ฐ .package(path:)
๋ฅผ ์ฌ์ฉํด์ค๋๋ค.
๋ค์ ๋ถ๋ ๋ฒ์ ์ ๊ฒฝ์ฐ
from
ํด๋น ๋ฒ์ ์ด์๋ถํฐ ์ฌ์ฉํฉ๋๋ค.
uptoNextMajor
๋ฉ์ด์ ๋ฒ์ ์ด ๋ฐ๋๊ธฐ ์ ๊น์ง ์ ๋ฐ์ดํธํ๋ฉฐ ์ฌ์ฉํฉ๋๋ค.
ex)
5.0.0
~6.0.0
uptoNextMinor ๋ง์ด๋ ๋ฒ์ ์ด ๋ฐ๋๊ธฐ ์ ๊น์ง ์ ๋ฐ์ดํธํ๋ฉฐ ์ฌ์ฉํฉ๋๋ค. ex)
5.0.0
~5.1.0
exact ํด๋น ๋ฒ์ ์ผ๋ก ๊ณ ์ ํ์ฌ ์ฌ์ฉํฉ๋๋ค.
targets
ํจํค์ง์ ์ฌ์ฉ๋ ํ๊ฒ๋ค์ ๊ฐ๊ฐ ๋ช ์ํฉ๋๋ค.
dependencies
์๋ ๋ณดํต ์์ dependencies์ ์ ํ ํจํค์ง๋ค์ด ์ ํ๊ณ , ํ๋์ ํจํค์ง์ ํ๊ฒ์ด ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ .product(name: "RxCocoa", package: "RxSwift")
์ ๊ฐ์ด ๊ฐ๊ฐ ์ ์ด์ค๋๋ค.
resources
์๋ ํ๊ฒ์์ ์ฌ์ฉ๋๋ ๋ฆฌ์์ค ํ์ผ๋ค์ ๋ช
์ํฉ๋๋ค.
๋จ .xcassets
, .storyboard
, .xib
, .nib
ํ์ผ๋ฑ๊ณผ ๊ฐ์ ๋ฆฌ์์ค ํ์ผ๋ค์ Xcode๊ฐ ๊ทธ ์ฌ์ฉ์ฒ๊ฐ ๋ถ๋ช
ํ๋ค๊ณ ํ๋จํ์ฌ ์๋์ผ๋ก ํจํค์ง์ด ์ด๋ฃจ์ด์ง๋๋ค.
ํ์ง๋ง ์ ํฌ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ํฐํธ์ ๊ฐ์ ์๋์ผ๋ก ํจํค์ง๋์ง ์๋ ํ์
์ ๋ฆฌ์์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ .process("Resources")
์ ๊ฐ์ด ๋ช
์ํด์ฃผ์์ต๋๋ค.
๋ฆฌ์์ค ๋ช ์๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ์ง์ํฉ๋๋ค.
- process
ํด๋น ๋๋ ํ ๋ฆฌ์ ์๋ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ํ๋์ depth๋ก ํ์คํํฉ๋๋ค.
ํ๋ซํผ์ ๋ฐ๋ผ Xcode๊ฐ ์ต์ ํ๋ฅผ ์งํํ ์ ์๋ค๋ฉด ์ต์ ํ๋ฅผ ์งํํด์ ๋ฆฌ์์ค ๋ฒ๋ค์ ์ต์์ ๋๋ ํ ๋ฆฌ์ ๋ณต์ฌํฉ๋๋ค.
- copy
๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ ๊ทธ๋๋ก ๋ณต์ฌํ์ฌ ์ฌ์ฉํฉ๋๋ค.
๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ตณ์ด ์ ์งํด์ผํ๋๊ฒ ์๋๋ผ๋ฉด ์ต์ ํ๋ ์งํ๋๋ process
๊ฐ ์ฌ์ฉ๋๋ค๊ณ ํฉ๋๋ค.
์ ๊ทผ ์ ์ด์
ํจํค์งํ๋ฅผ ํ ์ด์ ์ ๊ทผ์ ์ด์์ ๋์ฑ ์ ๊ฒฝ์ ์จ์ฃผ์ด์ผ ํฉ๋๋ค.
Swift์๋ ๋ค์ฏ๊ฐ์ง ์ ๊ทผ ์ ์ด์๊ฐ ์์ต๋๋ค.
- open, public
ํ๋ก์ ํธ ๋ด์ ๋ชจ๋ ๊ณณ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
open
๊ณผ public
์ ์ฐจ์ด๊ฐ ํจํค์ง์ ์ฌ์ฉํ๋ฉด์ ์ค์ํด์ง๋๋ค.
open
์ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ๋ชจ๋์์ overclass
๋ฅผ ํ์ฉํฉ๋๋ค. ํ์ง๋ง public
์ ์ด๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ BaseViewController
์ ๊ฐ์ด ์์์ด ํ์ํ ํด๋์ค์ ๊ฒฝ์ฐ open
์ผ๋ก ์ ๊ทผ์ ์ด์ด์ฃผ์ด์ผ ํฉ๋๋ค.
- internal
์๋ฌด ์ ๊ทผ์ ์ด์๋ ์์ฑํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฉ๋๋ ์ ๊ทผ์ ์ด์์ ๋๋ค. ์์ฑ๋ ๋ชจ๋ ์์์๋ง ์ ๊ทผ ๊ฐ๋ฅํฉ๋๋ค.
- fileprivate
์์ฑ๋ ์์ค ํ์ผ ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅํฉ๋๋ค.
- private
๊ฐ์ฅ ์ ํ์ ์ธ ์ ๊ทผ์ ์ด์์ ๋๋ค. ์์ฑ๋ ๊ฐ์ฒด ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅํฉ๋๋ค.
ํจํค์ง ์ ์ฉํ๊ธฐ
ํ๋ก์ ํธ์ ์ฑ ํ๊ฒ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ๋ฅผ ๋๋ฌ์ค๋๋ค.
Workspace ๋ด๋ถ์ ๋ง๋ค์ด๋์๊ธฐ ๋๋ฌธ์ ํจํค์ง๋ฅผ ๋ฐ๋ก ์ ํํ ์ ์์ต๋๋ค.
import
๊น์ง ํด๋ณด๋ฉด์ ์ ์์ ์ผ๋ก ์ถ๊ฐ๋์๋์ง ํ์ธํด๋ด
์๋ค!
References
Apple - Creating a standalone Swift package with Xcode
Apple - Bundling resources with a Swift package