관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 1. Tuist로 모듈화 - Templates (tuist scaffold, Project.swift, .stencil) 본문

iOS 응용 (swift)

[iOS - swift] 1. Tuist로 모듈화 - Templates (tuist scaffold, Project.swift, .stencil)

jake-kim 2023. 3. 11. 00:43

* 목차

템플릿화

  • 템플릿 코드를 미리 작성해놓고, 이 템플릿 코드를 실행하면 자동으로 커맨드 라인으로 넣은 값이 적용되도록 구현하는게 목적
  • Tuist 템플릿 코드 종류
    • .swift
    • .stencil

템플릿화 방법

  • 예제를 위해 디렉토리 준비
    • jake.swift는 템플릿중 하나이며, tuist scaffold를 이용하여 현재 디렉토리에 템플릿에서 입력한 내용의 코드가 생성
    • jake.swift는 아래에서 계속

주의) 

1) 이름을 꼭 Tuist, Templates으로 아래처럼 설정해야 동작함

2) Templates하위에 있는 폴더 이름과 그 폴더 안에 있는 .swift 파일 이름이 동일해야함 (jake 디렉토리 == jake.swift)

.
└── Tuist
    └── Templates
        └── jake
            └── jake.swift
  • jake.swift 템플릿
    • nameAttribute는 커맨드 라인에서 --name1과 같이 입력될 값
    • .required()이면 커맨드 라인에서 반드시 받아야하는 것이며, .optional()인 경우 옵셔널로 받는다는 의미
import ProjectDescription

// command line 입력 --name 파라미터에 들어가는 값
// ex) tuist scaffold jake --name1 hihi
let nameAttribute: Template.Attribute = .required("name1")

let template = Template(
    description: "Custom template",
    attributes: [
        nameAttribute
    ],
    items: [
        .string(
            path: "README.md",
            contents: "# \(nameAttribute)"
        )
    ]
)
  • README.md 생성
    • scaffold 사용 - scaffold는 템플릿을 참고하여 파일을 생성하는 명령어
tuist scaffold <templates 하위에 있는 폴더> --name1 hihi

결과)

.
└── Tuist
    ├── README.md
    └── Templates
        └── jake
            └── jake.swift
  • README.md 파일을 보면 아래처럼 내용이 등장 (템플릿 적용됨)
# hihi

 

.stencil, .swift 템플릿화

  • 지금까진 .string(path:contents:)로 템플릿화를 사용
import ProjectDescription

let nameAttribute: Template.Attribute = .required("name1")

let template = Template(
    description: "Custom template",
    attributes: [
        nameAttribute
    ],
    items: [
        .string(
            path: "README.md",
            contents: "# \(nameAttribute)" // <-
        )
    ]
)
  • contents에 들어가는 영역도 템플릿화 하고 싶은 경우, .file(path:templatePath:)를 사용하고 templatePath에 미리 만들어놓은 .stencil or .swift 사용
    • .stencil이란 템플릿할때 자주 사용하는 확장자명(문법은 이곳 참고)
  • README.stencil 템플릿을 만들고, 이 템플릿에 입력한 커맨드 라인의 이름으로 자동으로 .swift 파일이 생성되도록 구현
    • jake.swift 파일 위치와 같은 디렉토리에 추가
// 코드 출처: https://sarunw.com/posts/tuist-template/

# Welcome {{ name | capitalize }}

{% if name != "jake" %}
Nice to meet you!
{% endif %}

(결과)

.
└── Tuist
    ├── README.md
    └── Templates
        └── jake
            ├── README.stencil
            └── jake.swift
  • jake.swift파일 수정
    • items에 .file 추가
let nameAttribute: Template.Attribute = .required("name1")

let template = Template(
    description: "Custom template",
    attributes: [
        nameAttribute
    ],
    items: [
//        .string(
//            path: "README.md",
//            contents: "# \(nameAttribute)"
//        ),
        .file(
            path: "README.md",
            templatePath: "README.stencil"
        )
    ]
)
  • tuist scaffold로 다시 생성
tuist scaffold jake --name1 jake

(만들어진 README.md)

// 코드 출처: https://sarunw.com/posts/tuist-template/

# Welcome 

Nice to meet you!

* 전체 코드: https://github.com/JK0369/ExTuist-1

* 참고

https://github.com/tuist/tuist

https://sarunw.com/posts/tuist-template/

 

Comments