SwiftGen

SwiftGen

iOS 프로젝트 관리에 관한 라이브러리에 관하여 사용법등을 정리해보는 시간을 갖도록 하겠습니다.

SwiftGen 이란?

프로젝트에서 이미지,폰트,색상,영상 등 다양한 리소스에 대해서 auto-generate가 가능합니다. 즉, 자동으로 소스를 변경/생성해주어서 작업의 양을 줄이면서 타입의 안전성등을 보장해주는 라이브러리입니다.

SwiftGen의 장점

  • 리소스를 문자열을 통해 초기화 하여 사용할때 생길수 있는 오타를 피할수 있다.
  • auto-generate
  • asset의 name을 사용시 발생하는 문제(존재하지 않는 asset, 오타 등)

SwiftGen install

SwiftGen Install

설치 방법은 다양하지만 brew를 통한 설치로 테스트해보겠습니다.

$ brew update
$ brew install swiftgen

버전확인
$ swiftgen --version

실습

SwiftGen 은 5가지의 기본적으로 제공되는 템플릿이 존재합니다.

  1. String or Localization
  2. 스토리보드
  3. xcassets에 설정한 것들(image, git ..)
  4. 색상정보
  5. 추가한 폰트

시작하기 앞서 우선 Build Phases 에서 아래와 같이 스크립트를 추가합니다.

image

이제 내가 원하는 리소스에 대한 쉘스크립트를 작성하여 리소스가 되는 부분의 파일이 생성 되는지 확인해보겠습니다.

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 경로에 해당 소스파일이 생성된 것을 확인할 수 있습니다.

image

그리고 아직은 Xcode프로젝트에 생성된 swift파일이 추가가 되지 않았으니깐 추가해주도록 하면 소스코드를 확인할 수 있습니다.

그리고 중복해서 같은 템플릿의 리소스의 스크립트를 만들어서 실행시키면 동일한 자원의 output 소스파일이 생성돼서 충돌이 나더라구요 .. 사실 중복해서 할 이유는 없지만 참고하시길 바랍니다!

Asset 에 대해서 생성할 수 있는 enum 타입으로 리소스를 관리할 수 있습니다. 아래와 같이 기본 Asset 그리고 Color, Data, Image등 자동으로 열거형이 생성된 것을 확인할 수 있습니다.

image

그리고 asset에 색상을 두개 추가를 했고 이것을 어떻게 가져오는지 간단하게 테스트 해보겠습니다.

image

그런 다음 아까 빌드를 통해 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
    } 
}

image

앞에서 만들어 놓은 열거형에 내가 사용할 리소스를 프로퍼티 형식으로 등록해놓으면 static 이기 때문에 프로젝트 내에서 어디든지 위와 같이 가져와서 사용하는 것이 가장 큰 장점이고 앞에서 말한 단점들 또한 보완할 수 있습니다.

그밖에도 Plist, CoreData등에 대한 스크립트를 작성할 수 있습니다.

결론적으로 SwiftGen의 궁극적인 목적은 이런 리소스의 관리를 도운다는 것에 있는것 같습니다. 프로젝트를 할때 사실 따로 enum형을 만들어 놓고 관리하는 방법도 있지만 이런식으로 자동으로 생성해주어서 내가 원하는 리소스 타입에 맞게 관리를 할 수 있습니다.

그리고 리소스의 추가가 많이 일어나지 않는다면 빌드 시점에서 스크립트가 실행되게 하지말고 수정이 일어날때 별도로 Shell에서 스크립트 명령어로 실행하여 관리하는 것도 가능합니다.

Reference





© 2020. by Gaki

Powered by gaki