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
640
Sign In with Apple
nonchalant
1
2.5k
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
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
1.2k
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
2
210
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
2
440
実装をデザインガイドラインに追従させるための取り組み / 260731-dip-mosh-design-system
dachi023
0
7.8k
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
620
ALB ログから Trace を気合で繋げる技術
fohte
5
590
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
210
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
160
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
2
1.2k
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
240
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
240
VibeCodingからAgenticWorkflowへ
starfish719
0
870
Featured
See All Featured
Utilizing Notion as your number one productivity tool
mfonobong
4
550
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
490
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
220
The Art of Programming - Codeland 2020
erikaheidi
57
14k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
500
Writing Fast Ruby
sferik
630
63k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
310
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
870
A Soul's Torment
seathinner
6
3.5k
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