🔥 Resource

316자
4분

Swift Package Manager 5.3 버전부터는 패키지에 리소스 파일을 넣을 수 있게 되었어요. 리소스를 쓰려면 먼저 그 리소스가 들어갈 타깃 폴더 안에 넣어야 해요. 가령 MyLibrary 타깃의 리소스는 Sources/MyLibrary 폴더 안에 있어야 한답니다.

리소스 파일을 잘 정리하려면 폴더를 나누는 게 좋아요. 예를 들면 모든 리소스 파일을 Resources 폴더에 모으면 Sources/MyLibrary/Resources에서 찾기 쉽죠.

보통 Swift Package Manager는 Apple 플랫폼에서 많이 쓰는 리소스 타입을 알아서 처리해요. 그래서 XIB 파일, 스토리보드, Core Data 파일, 에셋 카탈로그 같은 건 패키지 설정 파일에 따로 적어주지 않아도 된답니다.

그런데 이미지 파일 같은 다른 파일은 process(_:localization:) 또는 copy(_:) 규칙을 써서 리소스라고 정확히 알려줘야 해요.

또는 타깃을 만들 때 exclude로 넘겨주어 해당 리소스 파일을 타깃에서 제외할 수도 있답니다.

Resource 구조체의 메서드

process(_:localization:)

이 메서드는 어떤 경로에 있는 리소스에 플랫폼에 맞는 규칙을 적용해요.

static func process(
    _ path: String,
    localization: Localization? = nil
) -> Resource
swift
  • path: 리소스가 있는 경로를 나타내는 문자열이에요.
  • localization: 리소스의 언어 종류인데, 안 적으면 nil이에요.

process 규칙을 쓰면 Swift Package Manager가 그 경로에 있는 리소스를 빌드할 플랫폼에 맞게 최적화할 수 있어요. 예를 들어, 이미지 파일 최적화를 지원하는 플랫폼이면 이미지 파일을 최적화하죠. 만약 어떤 파일은 최적화할 수 없으면, 그냥 파일을 복사한답니다.

경로가 폴더라면, Swift Package Manager는 그 폴더 안에 있는 모든 파일에 대해 재귀적으로 process 규칙을 차례차례 적용해요.

될 수 있으면 copy(_:) 대신 이 규칙을 쓰는 게 좋아요.

copy(_:)

이 메서드는 어떤 경로에 있는 리소스를 그냥 복사해요.

static func copy(_ path: String) -> Resource
swift
  • path: 리소스가 있는 경로를 나타내는 문자열이에요.

될 수 있으면 process(_:localization:)를 써서 리소스를 자동으로 최적화하는 게 좋아요.

그런데 리소스를 건드리면 안 되거나 폴더 구조를 그대로 유지해야 할 때는 copy 규칙을 쓰세요. 이 규칙은 그 경로에 있는 리소스를 있는 그대로 패키지의 리소스 번들 최상위 레벨에 복사한답니다. 경로가 폴더라면, Xcode는 해당 폴더 구조를 그대로 유지해요.

이렇게 Resource 구조체를 쓰면 Swift 패키지에 여러 가지 리소스를 쉽게 넣을 수 있어요. 플랫폼에 맞는 최적화도 알아서 해 주고, 필요하면 리소스를 그냥 복사할 수도 있죠.