Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
potatotips #45: XcodeGenでxcodeprojを卒業する
Search
Takeshi Ihara
November 05, 2017
Programming
1.7k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
potatotips #45: XcodeGenでxcodeprojを卒業する
https://potatotips.connpass.com/event/70161/
Takeshi Ihara
November 05, 2017
More Decks by Takeshi Ihara
See All by Takeshi Ihara
iOSDC20200921: Feature Flagを適切に分類することでA/Bテストの運用コストを下げる
nonchalant
3
1.4k
iOSDC 20190906: 動画アプリの投げ銭機能における 消耗型課金の仕組みと実装
nonchalant
3
6.5k
iOSDC 20190906: 動画アプリの投げ銭機能における 消耗型課金の仕組みと実装 with 発表ノート
nonchalant
2
650
Sign In with Apple
nonchalant
1
2.5k
iOSDC RejectCon 20180915: Factoryの自動生成によりテストを書きやすくする
nonchalant
1
770
iOSDC 20180902: 小さくはじめる端末管理
nonchalant
2
1.1k
devsap 20180728: コード生成のススメ
nonchalant
0
150
potatotips #50: iOSは自動生成の夢を見るか?
nonchalant
0
2k
try! Swift Tokyo 2018: Best Docker Container in Swift
nonchalant
1
1.4k
Other Decks in Programming
See All in Programming
우리의 Nitro Modules는 당신의 Turbo Modules보다 아름답다
l2hyunwoo
0
220
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.7k
ActionController meets Protocol Buffers
sorah
1
710
PyConTW 2026 - AI Coding 不只是工具升級, 區域醫院醫療資訊系統協作開發與資訊團隊轉型實踐
cclai999
0
200
Seven New Principles of Software Engineering
yegor256
0
320
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
960
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
190
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
6
1.9k
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.2k
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
4
1.3k
Jetpack Compose Mechanisms
skydoves
3
870
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
320
Featured
See All Featured
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
530
Between Models and Reality
mayunak
4
510
YesSQL, Process and Tooling at Scale
rocio
174
15k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.8k
Code Review Best Practice
trishagee
74
20k
Making Projects Easy
brettharned
120
6.8k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
500
Color Theory Basics | Prateek | Gurzu
gurzu
1
500
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
1
290
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
370
Transcript
XcodeGenͰ xcodeprojΛଔۀ͢Δ potatotips #45
Takeshi Ihara • Recruit Marketing Partners • iOS Engineer •
Twitter: @nonchalant0303 • GitHub: Nonchalant potatotips #45
*.xcodeproj potatotips #45
*.xcodeproj • Target • Build Settings • Framework Search Paths
• Other Linker Flags • Build Phases • Target Dependencies potatotips #45
͜Μͳܦݧ͋Γ·ͤΜ͔ʁ potatotips #45
*.xcodeproj͕ίϯϑϦΫτ ! potatotips #45
*.xcodeproj͕ίϯϑϦΫτ • मਖ਼͢ΔͷʹͦΕͳΓʹ͕͔͔࣌ؒΔ • Ϛʔδʹޭͯ͠fileRef͕ফ͑ͯͨΓ͢Δ • etc. potatotips #45
*.xcodeprojΛཧͨ͘͠ͳ͍ʂ potatotips #45
XcodeGen potatotips #45
XcodeGen • XcodeGen is a command line tool that generates
your Xcode project using your folder structure and a simple project spec. • Create projects on demand and remove your .xcodeproj file from git, which means no merge conflicts! potatotips #45
project.yml → *.xcodeproj $ xcodegen potatotips #45
Target Dependencies StaticDI Presentataion, Domain, Infrastructure, Utility Presentataion Domain, Utility
Domain Infrastructure Infrastructure Utility Utility potatotips #45
project.pbxproj // !$*UTF8*$! { archiveVersion = 1; classes = {
}; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 0589839EF066302FF8381EF1 /* Pods_DomainTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AD1D884549577507D3FBD6A /* Pods_DomainTests.framework */; }; 0ECEFC8C0E72FFA519EC2740 /* Pods_InfrastructureTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3285CF508C3CB86BE9DCE8A5 /* Pods_InfrastructureTests.framework */; }; 53174BD72660AA80143107FF /* Pods_StaticDI_Domain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 45709A372BBAB5EC0B10BFF3 /* Pods_StaticDI_Domain.framework */; }; 7720E1165E98C88CC7BA1B17 /* Pods_PresentationTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1427075075D0CFFD058086C1 /* Pods_PresentationTests.framework */; }; 7C0310147FC3B2700128268C /* Pods_StaticDI_Presentation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5EB7D94A9CCC16376FF5D112 /* Pods_StaticDI_Presentation.framework */; }; B9661B4B325165B87A0F5268 /* Pods_StaticDI_Infrastructure.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BD1C3F976060CDB4B30DD2F1 /* Pods_StaticDI_Infrastructure.framework */; }; BD3B20E49EE2D33D8C566633 /* Pods_StaticDI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BED0EFF050F9E406821BF26A /* Pods_StaticDI.framework */; }; BF1073850101 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR1332263601 /* AppDelegate.swift */; }; BF1374745401 /* Utility.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR8713155301 /* Utility.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; BF1543799701 /* Infrastructure.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR1289457301 /* Infrastructure.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; BF1744565901 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR6218091901 /* ViewController.swift */; }; BF1919872001 /* Domain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR4795479601 /* Domain.framework */; }; BF1980193001 /* InfrastructureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR5797085901 /* InfrastructureTests.swift */; }; BF2036675501 /* Presentation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR8064748501 /* Presentation.framework */; }; BF2250910101 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG2043127501 /* Main.storyboard */; }; BF2445564001 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG2858723001 /* LaunchScreen.storyboard */; }; BF2822552901 /* DomainTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR2760474101 /* DomainTests.swift */; }; BF3154421201 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR5980633301 /* Assets.xcassets */; }; BF4763127901 /* Infrastructure.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR1289457301 /* Infrastructure.framework */; }; BF4993005301 /* Utility.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR8713155301 /* Utility.framework */; }; BF6069884001 /* UtilityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR9054953201 /* UtilityTests.swift */; }; BF6448005701 /* Domain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR4795479601 /* Domain.framework */; }; BF6463449201 /* Utility.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR8713155301 /* Utility.framework */; }; BF6841545201 /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR5638879301 /* Log.swift */; }; BF7785221801 /* Presentation.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR8064748501 /* Presentation.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; BF8144242901 /* Utility.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR8713155301 /* Utility.framework */; }; BF8650047401 /* Domain.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR4795479601 /* Domain.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; BF8764956401 /* Utility.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR8713155301 /* Utility.framework */; }; BF8779185001 /* Infrastructure.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR1289457301 /* Infrastructure.framework */; }; BF8884663701 /* PresentationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR2071871501 /* PresentationTests.swift */; }; potatotips #45
project.yml name: StaticDI settings: base: IPHONEOS_DEPLOYMENT_TARGET: 11.1 targets: StaticDI: dependencies:
- target: Presentation - target: Domain - target: Infrastructure - target: Utility type: application platform: iOS sources: StaticDI settings: INFOPLIST_FILE: StaticDI/Supporting Files/info.plist PRODUCT_BUNDLE_IDENTIFIER: com.nonchalant.StaticDI scheme: testTargets: StaticDITests postbuildScripts: - script: ${SRCROOT}/Pods/SwiftLint/swiftlint autocorrect\n${PODS_ROOT}/SwiftLint/swiftlint lint name: Swiftlint Run Script ... potatotips #45
project.pbxproj project.yml Մಡੑ ! " ίϯϑϦΫτͷൃੜ ස ߴ͍ ͍ ߦ
2123 142 potatotips #45
RIP *.xcodeproj potatotips #45