SwiftGen
SwiftGen
iOS 프로젝트 관리에 관한 라이브러리에 관하여 사용법등을 정리해보는 시간을 갖도록 하겠습니다.
SwiftGen 이란?
프로젝트에서 이미지,폰트,색상,영상 등 다양한 리소스에 대해서 auto-generate가 가능합니다. 즉, 자동으로 소스를 변경/생성해주어서 작업의 양을 줄이면서 타입의 안전성등을 보장해주는 라이브러리입니다.
SwiftGen의 장점
- 리소스를 문자열을 통해 초기화 하여 사용할때 생길수 있는 오타를 피할수 있다.
- auto-generate
- asset의 name을 사용시 발생하는 문제(존재하지 않는 asset, 오타 등)
SwiftGen install
설치 방법은 다양하지만 brew를 통한 설치로 테스트해보겠습니다.
$ brew update
$ brew install swiftgen
버전확인
$ swiftgen --version
실습
SwiftGen 은 5가지의 기본적으로 제공되는 템플릿이 존재합니다.
- String or Localization
- 스토리보드
- xcassets에 설정한 것들(image, git ..)
- 색상정보
- 추가한 폰트
시작하기 앞서 우선 Build Phases 에서 아래와 같이 스크립트를 추가합니다.
이제 내가 원하는 리소스에 대한 쉘스크립트를 작성하여 리소스가 되는 부분의 파일이 생성 되는지 확인해보겠습니다.
Script 작성
# string test 01
swiftgen strings "${SRCROOT}/${TARGETNAME}/Resources/GakiString.strings" --template structured-swift4 --output "${SRCROOT}/${TARGETNAME}/Generated/String+Generated.swift"
# storyboard test 02
swiftgen storyboards -t swift4 "${SRCROOT}/${TARGETNAME}/Base.lproj/Main.storyboard" -o "${SRCROOT}/${TARGETNAME}/Generated/Storyboard+Generated.swift"
# Xcassets test 03
swiftgen xcassets "${SRCROOT}/${TARGETNAME}/Assets.xcassets" -t swift4 -o "${SRCROOT}/${TARGETNAME}/Generated/Assets+Generated.swift"
# Color test 04
swiftgen colors -t swift4 "${SRCROOT}/${TARGETNAME}/Resources/color.rtf" -o "${SRCROOT}/${TARGETNAME}/Generated/Color+Generated.swift"
# Font test 05
swiftgen fonts -t swift4 "${SRCROOT}/${TARGETNAME}/Resources/Font" -o "${SRCROOT}/${TARGETNAME}/Generated/Font+Generated.swift"
스크립트 작성에 대한 자세한 내용은 SwiftGen 에 정리가 잘 되어있습니다. 스크립트문의 구조는 우선 내가 코드로 관리하고 싶은 리소스의 파일 경로를 input, 그리고 template는 지원하는 Swift버전을 선택할 수 있습니다. 위의 예제 에서는 swift4버전으로 테스트를 하고 있습니다. 그리고 리소스를 코드로 관리할 수있는 .swift 파일 형식의 output이렇게 입력을 하게 됩니다.
Color를 따로 관리하는 Xcasset 파일을 generate 해보겠습니다.
- 스크립트 작성
swiftgen xcassets "${SRCROOT}/${TARGETNAME}/Color.xcassets" -t swift4 -o "${SRCROOT}/${TARGETNAME}/Generated/ColorAssets+Generated.swift"
위의 스크립트를 해석해보면 input의 리소스를 내가원하는 template 기반으로 output파일로 관리하겠다 라고 해석하시면 됩니다.
input :
"${SRCROOT}/${TARGETNAME}/Color.xcassets"
생성한 Color Asset의 경로를 나타내게 됩니다.- template: swift4
- output:
"${SRCROOT}/${TARGETNAME}/Generated/ColorAssets+Generated.swift"
input resource generate할 소스파일의 경로입니다.
자 그럼 곧바로 빌드를 하게 되면 내가 지정한 output 경로에 해당 소스파일이 생성된 것을 확인할 수 있습니다.
그리고 아직은 Xcode프로젝트에 생성된 swift파일이 추가가 되지 않았으니깐 추가해주도록 하면 소스코드를 확인할 수 있습니다.
그리고 중복해서 같은 템플릿의 리소스의 스크립트를 만들어서 실행시키면 동일한 자원의 output 소스파일이 생성돼서 충돌이 나더라구요 .. 사실 중복해서 할 이유는 없지만 참고하시길 바랍니다!
Asset 에 대해서 생성할 수 있는 enum 타입으로 리소스를 관리할 수 있습니다. 아래와 같이 기본 Asset 그리고 Color, Data, Image등 자동으로 열거형이 생성된 것을 확인할 수 있습니다.
그리고 asset에 색상을 두개 추가를 했고 이것을 어떻게 가져오는지 간단하게 테스트 해보겠습니다.
그런 다음 아까 빌드를 통해 generated한 ColorAsset+Generated.swift 파일로 가서 해당하는 열거형에 내가 추가를해서 사용하고 싶은 리소스를 직접 추가를 해주도록 합니다.
internal enum Asset {
internal static let gakiBlue = ColorAsset(name: "GakiBlue")
internal static let gakiRed = ColorAsset(name: "GakiRed")
}
그런다음 내가 직접 사용하고 싶은 곳에 가져와서 테스트를 해보겠습니다.
class ViewController: UIViewController {
@IBOutlet weak var blueView: UIView?
@IBOutlet weak var redView: UIView?
override func viewDidLoad() {
super.viewDidLoad()
blueView?.backgroundColor = Asset.gakiBlue.color
redView?.backgroundColor = Asset.gakiRed.color
}
}
앞에서 만들어 놓은 열거형에 내가 사용할 리소스를 프로퍼티 형식으로 등록해놓으면 static 이기 때문에 프로젝트 내에서 어디든지 위와 같이 가져와서 사용하는 것이 가장 큰 장점이고 앞에서 말한 단점들 또한 보완할 수 있습니다.
그밖에도 Plist, CoreData등에 대한 스크립트를 작성할 수 있습니다.
결론적으로 SwiftGen의 궁극적인 목적은 이런 리소스의 관리를 도운다는 것에 있는것 같습니다. 프로젝트를 할때 사실 따로 enum형을 만들어 놓고 관리하는 방법도 있지만 이런식으로 자동으로 생성해주어서 내가 원하는 리소스 타입에 맞게 관리를 할 수 있습니다.
그리고 리소스의 추가가 많이 일어나지 않는다면 빌드 시점에서 스크립트가 실행되게 하지말고 수정이 일어날때 별도로 Shell에서 스크립트 명령어로 실행하여 관리하는 것도 가능합니다.