Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
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.4k
iOSDC 20190906: 動画アプリの投げ銭機能における 消耗型課金の仕組みと実装 with 発表ノート
nonchalant
2
630
Sign In with Apple
nonchalant
1
2.4k
iOSDC RejectCon 20180915: Factoryの自動生成によりテストを書きやすくする
nonchalant
1
750
iOSDC 20180902: 小さくはじめる端末管理
nonchalant
2
1k
devsap 20180728: コード生成のススメ
nonchalant
0
140
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
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
220
act2-costs.pdf
sumedhbala
0
110
1年で人数1.5倍、PR数5.5倍増。 品質とアウトカムはどうなったか、 何が効いたか
ike002jp
0
120
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
360
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.4k
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
150
AIエージェントで 変わるAndroid開発環境
takahirom
2
510
自作OSでスライド発表する
uyuki234
1
3.8k
コーディングルールの鮮度を保ちたい for SRE NEXT 2026 / keep-fresh-go-internal-conventions-sre-next-2026
handlename
0
140
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
580
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
310
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
260
Featured
See All Featured
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
63
55k
The Cult of Friendly URLs
andyhume
79
6.9k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
310
Joys of Absence: A Defence of Solitary Play
codingconduct
1
410
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
760
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Balancing Empowerment & Direction
lara
6
1.2k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
190
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
560
Exploring anti-patterns in Rails
aemeredith
3
440
We Have a Design System, Now What?
morganepeng
55
8.2k
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