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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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.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
5分で問診!Composer セキュリティ健康診断
codmoninc
0
850
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
140
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
400
テーブルをDELETEした
yuzneri
0
130
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
130
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
200
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
250
今さら聞けない .NET CLI
htkym
0
180
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
360
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
3
750
その節約、円になってますか?
isamumumu
1
680
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
200
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
420
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
690
4 Signs Your Business is Dying
shpigford
187
22k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
240
Facilitating Awesome Meetings
lara
57
7.1k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
240
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
650
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