๐Ÿ‘‹ ์•ˆ๋…• XcodeGen

์˜ค๋Š˜์€ XcodeGen์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ๊ณผ ๊ทธ ๊ฒฐ๊ณผ๋กœ ๋‚ด๋ฆฐ ๊ฒฐ๋ก ์— ๋Œ€ํ•ด ์–˜๊ธฐํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

bg

XcodeGen์ด๋ž€?

XcodeGen์€ ํด๋” ๊ตฌ์กฐ์™€ ํ”„๋กœ์ ํŠธ ์ŠคํŽ™์— ๋งž์ถฐ์„œ Xcode ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ปค๋งจ๋“œ ๋ผ์ธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ ๋ผ์ธ์—์„œ XcodeGen์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์— ๋ฆฌ๋“œ๋ฏธ๋งŒ ์ฝ๊ณ  ํฐ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด๋ ค ํ•˜๋ฉด ๋ง‰๋ง‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ๋ฒ•์„ ์ฐจ๋ก€๋Œ€๋กœ ์ฝ์œผ๋ฉฐ ์ž‘์€ ํ”„๋กœ์ ํŠธ์— ๊ธฐ๋Šฅ์„ ๋‹จ๊ณ„์ ์œผ๋กœ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

XcodeGen์˜ ํŠน์ง•

  • ํ”„๋กœ์ ํŠธ ํŒŒ์ผ(.xcodeproj)์„ ์ฝ”๋“œ ์ €์žฅ์†Œ์— ์˜ฌ๋ฆฌ์ง€ ์•Š๊ณ  ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋จธ์ง€ํ•  ๋•Œ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์—์„œ ์ปจํ”Œ๋ฆญํŠธ๊ฐ€ ์ƒ๊ธธ ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค.

  • ํ”„๋กœ์ ํŠธ ์„ค์ •์„ ๋ด์•ผ ํ•  ๋•Œ ์ด๊ณณ์ €๊ณณ ๋Œ์•„๋‹ค๋‹ ํ•„์š” ์—†์ด project.yml ํŒŒ์ผ ํ•˜๋‚˜๋งŒ ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ์ฐ์–ด๋‚ผ ๋•Œ ํŽธํ•ฉ๋‹ˆ๋‹ค. ์ € ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ์ˆ  ์ ์šฉ์„ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ ์•ฑ ํ”„๋กœ์ ํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ฐ์–ด๋‚ผ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ์š”, ์ด๋Ÿด ๋•Œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” project.yml ํŒŒ์ผ์ด ์žˆ์œผ๋‹ˆ ์ฐธ ํŽธํ–ˆ์Šต๋‹ˆ๋‹ค.

  • SwiftGen, SwiftLint ๋“ฑ Build Phase์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๋•Œ๋„ ๊ฐ„ํŽธํ•˜๊ฒŒ project.yml ํŒŒ์ผ์— ์ ์–ด๋‘๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • Carthage๋ฅผ ์ถ”๊ฐ€์ ์ธ ์„ค์ •์—†์ด ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค๋งŒ, ์‚ฌ์šฉํ•ด๋ณด์ง„ ์•Š์•˜์Šต๋‹ˆ๋‹ค. Carthage๋Š” ์‚ฌ์šฉํ•˜๋ ค๋ฉด Xcode 12์—์„  ๋ณ„๋„์˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•„์š”ํ•œ๋ฐ๋‹ค๊ฐ€, M1์นฉ์—์„  ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹น๋ถ„๊ฐ„ Carthage๋ฅผ ์“ธ ์ผ์€ ์—†์„ ๊ฒƒ ๊ฐ™์•„ ํ…Œ์ŠคํŠธ๋ฅผ ์•ˆํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•ด์ฃผ์„ธ์š”.

์‹ค์ œ ์‚ฌ์šฉ ์˜ˆ์‹œ

์ €๋Š” ์‹ค์ œ๋กœ ๋œจ๊ฐœ์งˆ ๋‹จ์ˆ˜๊ณ„ ๊ฒธ ๋ญ๋“  ์…€ ์ˆ˜ ์žˆ๋Š” ์นด์šดํ„ฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ธ Stitch์—์„œ XcodeGen์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. project.yml ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๊ป๋ฐ๊ธฐ๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋‚ด์šฉ์ด๋ผ pod์ด ์—†๋Š”๋ฐ๋„ pod install์„ ํ•˜๊ณ , SPM๋„ ๋ช‡ ๊ฐœ ์“ฐ๊ณ  ์žˆ์ง€ ์•Š์ง€๋งŒ ์ด๊ฒƒ๋งŒ์œผ๋กœ๋„ ๊ฐœ์ธ ์ž‘์—… ๋Šฅ๋ฅ ์ด ๋งŽ์ด ์˜ฌ๋ผ๊ฐ”์Šต๋‹ˆ๋‹ค.

ํž˜๋“  ์ 

XcodeGen์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ .xcodeproj ํŒŒ์ผ์„ .gitignore์— ์ ์–ด๋‘ก๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ origin์˜ ๋ฐ”๋€ ์ฝ”๋“œ๋ฅผ pullํ•˜๊ฑฐ๋‚˜ main ๋ธŒ๋žœ์น˜์—์„œ rebase๋‚˜ merge๋กœ ๋•ก๊ฒจ์˜ฌ ๋•Œ ์ฝ”๋“œ๋Š” ๋ฐ”๋€Œ์ง€๋งŒ .xcodeproj๋Š” ๊ทธ๋Œ€๋กœ์ธ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋งค๋ฒˆ xcodegen generate ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ €๋Š” ์ด ๋ถ€๋ถ„์ด ๋งŽ์ด ๊ท€์ฐฎ์•˜์Šต๋‹ˆ๋‹ค.

์ด ๊ท€์ฐฎ์Œ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด git hooks๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ๋น„์Šทํ•œ ๊ฒƒ์„ ์ฐพ์•˜์ง€๋งŒ ์ €ํ•œํ…Œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

ํ‰์†Œ์— git pull์ด๋‚˜ merge๋ฅผ ํ•  ๋•Œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœํŒ€์ด ์•„๋‹ˆ๋ผ๋ฉด XcodeGen์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์กฐ๊ธˆ ๋ฌด๋ฆฌ๊ฐ€ ์žˆ์„๊ฑฐ๋ž€ ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค.

XcodeGen์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ํŒ€์›๊ณผ์˜ ๋งŽ์€ ๋…ผ์˜๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜‘์—…ํ•˜๋Š” ์ธ์›์ด ๋งŽ์ง€ ์•Š๊ฑฐ๋‚˜ ์›Œํ‚น ๋ธŒ๋žœ์น˜๊ฐ€ ์ ์€ ๊ฒฝ์šฐ์—” ์•„์ฃผ ์ ํ•ฉํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ์—ฌ๊ธฐ๊นŒ์ง€ ์ž…๋‹ˆ๋‹ค! ์ €๋Š” ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์— XcodeGen์„ ๊ณ„์† ์‚ฌ์šฉํ•ด๋ณด๊ณ  ๋” ๊นŠ๊ฒŒ ์•Œ์•„๋ด์•ผ๊ฒ ๋„ค์š”.

์ฐธ๊ณ ํ•œ ๊ธ€