Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
OSS Forward Workshop
giginet
May 12, 2022
Programming
2
700
OSS Forward Workshop
giginet
May 12, 2022
Tweet
Share
More Decks by giginet
See All by giginet
Crossroad - 最高のCustom URL Schemeルーティングを支える技術2021
giginet
4
280
わいわいDocC ~ waiwai-docc ~
giginet
0
53
今日から使える実践的Swift Concurrency / Introducing Swift Concurrency
giginet
1
84
大規模なアプリのマルチモジュール構成の実践
giginet
4
9.8k
モバイルアプリ行動ログ基盤を”大統一”した話
giginet
0
2.2k
XcodeGen超入門
giginet
8
2.6k
👾 令和時代のゲームボーイ開発
giginet
3
6.6k
Azure Pipeline
giginet
0
1.3k
Cookpad Spring Intern 2019 - Swiftコンパイラ -
giginet
1
7.3k
Other Decks in Programming
See All in Programming
短納期でローンチした新サービスをJavaで開発した話/launched new service using Java
eichisanden
6
1.9k
GDG Seoul IO Extended 2022 - Android Compose
taehwandev
0
290
はてなフォトライフをECSに移行した話 / Hatena Engineer Seminar #20
cohalz
1
820
Maintaining Software Correctness
dlew
PRO
3
240
Android Tools & Performance
takahirom
1
430
VisualProgramming_GoogleHome_LINE
nearmugi
1
140
Custom Design Systems in Compose UI
rharter
5
520
Amazon Aurora の v1 が EOL になるので 10 クラスタアップグレードして出てきたノウハウ
dekokun
0
850
ES2022の新機能
smt7174
0
140
Web API連携でCSRF対策がどう実装されてるか調べた / how to implements csrf-detection on Web API
yasuakiomokawa
2
310
Android スキルセットをフル活用して始めるスマートテレビアプリ開発
satsukies
1
190
パターンマッチングを学んで新しいJavaの世界へ!Java 18までの目玉機能をおさらいしよう / Java 18 pattern matching
ihcomega56
3
390
Featured
See All Featured
Making Projects Easy
brettharned
98
4.3k
Build your cross-platform service in a week with App Engine
jlugia
219
17k
Thoughts on Productivity
jonyablonski
43
2.3k
Principles of Awesome APIs and How to Build Them.
keavy
113
15k
What's in a price? How to price your products and services
michaelherold
229
9.4k
Why You Should Never Use an ORM
jnunemaker
PRO
47
7.3k
Facilitating Awesome Meetings
lara
29
4k
Navigating Team Friction
lara
175
11k
A better future with KSS
kneath
225
15k
What the flash - Photography Introduction
edds
61
10k
VelocityConf: Rendering Performance Case Studies
addyosmani
316
22k
Statistics for Hackers
jakevdp
781
210k
Transcript
OSSίϛολʔʹͳΖ͏ʂ 5/12 ϫʔΫγϣοϓ @ Money Forward @giginet 1/51
ࣗݾհ • @giginet • Core Contributor of Carthage/fastlane/ XcodeGen etc...
• https://github.com/giginet • https://twitter.com/giginet • ؾܰʹmention͍ͯͩ͘͠͞ʂ 2/51
! త • ओʹiOSͰͷOSSͷίϛοτΛମݧΛ͢Δ • ࣮ࡍʹϚʔδ͞ΕΔΑ͏ͳPRΛૹΓɺOSSʹߩݙ͢Δ • ৺ཧతোนΛݮΒ͢ɻඞཁʹԠ͡OSSʹߩݙͰ͖ΔΑ͏ʹ͢ Δ •
MoneyForward iOSΤϯδχΞؒͷަྲྀ • ϫʔΫγϣοϓͰऔΓΜͩ՝Λݩʹަྲྀ͢Δ 3/51
⏱ λΠϜςʔϒϧ 14:00 ߨٛ 14:20~ ! OSSମݧϫʔΫγϣοϓ 17:20~ " ൃදձ
+ ࣗݾհ 18:00~ # 4/51
PR͕Ϛʔδ͞ΕΔ·Ͱ 5/51
1. ωλ୳͠ 2. ௐࠪ 3. ࣮ 4. ςετ 5. Pull
Request 6. Ϛʔδ ! 6/51
1. ωλ୳͠ • ԿΛ࣮͢Δ͔ܾΊΔ • OSSߩݙʹ͓͍ͯҰ൪͍͠ • ՝ൃݟΛͲͷΑ͏ʹ͍͔͕ͯ͘͠ॏཁ 7/51
i. ͍ͬͯͯػೳཁόάΛݟ͚ͭΔ • ৗతʹ͍ͬͯΔπʔϧOSSͷதͰෆ۩߹ཁΛൃݟ͢ Δ • ͜Μͳػೳཉ͍͠ • ͜ͷڍಈʹࠔͬͨ •
typoൃݟ • Ұ൪ྑ͍՝ൃݟํ๏͕ͩɺ͜Ε͕Ͱ͖Εۤ࿑͠ͳ͍ 8/51
ii. issueτϥοΧʔΛݟΔ • ීஈ͍ͬͯΔϥΠϒϥϦɺπʔϧɺ༗໊OSSʹ͍ͭͯ GitHub issueΛோΊͯΈΔɻͳΜͱͳ͘՝͕΄͍͠߹ʹ ͍͍ͯΔɻ • ϓϩδΣΫτʹΑͬͯॳ৺ऀܴϥϕϧ͕͍͍ͯΔ߹ •
appleͷϦϙδτϦGood First Issue ϥϕϧ͕͍͍ͯΔ ͷͰɺमߦʹ͍࣋ͬͯ͜ 9/51
iii. υΩϡϝϯτͷߩݙɺ • ίϚϯυͷϛεɺtypoɺϦϯΫΕͳͲΑ͘ݟ͚ͭΒΕΔͷ Ͱݟ͚ͭͨΒŢœŕͱͤΔ • ܰඍͳमਖ਼Ͱͳ͍ɻ 10/51
ߩݙ͍͢͠issue • Ϛʔδͷ͞Ε͢͞ • ෆ۩߹ɺΤοδέʔεͷߟྀ࿙ΕͳͲɺؒҧ͍ͬͯΔ͜ͱ͕ ໌֬ͳͷ • issue্Ͱ͕ٞਐΜͰ͓Γɺ࣮ͪͷঢ়ଶͷͷ(ϥϕϧ ͳͲ͕͍͍ͯΔέʔε) •
ޙํޓΛ่͞ͳ͍ͷɻͯ͠ͳ͍ͷ 11/51
ߩݙ͕େมͳissue • େنͳػೳՃϚʔδ·Ͱ͍͠ • ༷࣮ʹ͍ͭͯɺAuthorͱٞͯ͠ຏ͘ඞཁ͕͋Δ • దͳ༷͔ • ߟྀ࿙Εͳ͍͔ •
ίʔσΟϯάنൣʹଇ͍ͯ͠Δ͔ɾΑΓྑ͍ॻ͖ํͳ͍ ͔ 12/51
ωλ୳͕͠Ұ൪͍͠ • OSSʹߩݙ͠Α͏ͱ͍͏ϞνϕʔγϣϯΛ࡞Δͷ͕Ұ൪͍͠ • Δ͜ͱ͕໌֬ͩͬͨΓɺࣗʹͱͬͯඞཁͳΒखΛ͚͢ ͍ • ࠓճ͍͔ͭ͘खΛ͚͍͢issueΛ༧Ί୳͖ͯͨ͠ͷͰɺ͜ ͷաఔΛ͋ΔఔεΩοϓͰ͖·͢ 13/51
2. ௐࠪ 14/51
ௐࠪͷखॱ 1. ։ൃڥͷߏங 2. ࠶ݱঢ়گͷ༻ҙ 3. ݪҼͷௐࠪ • σόοΨʔͷར༻ 15/51
1. ։ൃڥͷߏங • ϦϙδτϦͷclone • Ϗϧυڥͷߏங • खݩͰ࣮ߦͰ͖ΔΑ͏ʹ͢Δ 16/51
2. ࠶ݱঢ়گͷ༻ҙ • ࠷খ࠶ݱڥΛ࡞Δ • ৽نϓϩδΣΫτ࡞ɺcloneͨ͠ґଘϥΠϒϥϦΛऔΓࠐΉ • લఏ݅ΛௐΔɺ༻ҙ͢Δ • ಛఆͷঢ়گԼͰ͕ى͖Δͱ͖ɺͦͷέʔεΛ༻ҙ͢Δ
ʢઃఆϑΝΠϧͳͲʣ • ςετέʔεͷ༻ҙ 17/51
3. ݪҼͷௐࠪ • lldb(σόοΨʔ)ɺbreakpointͳͲɺ௨ৗͷσόοάख๏Λۦ ͢Δʢޙड़ʣ 18/51
ςετίʔυͷ࣮ • ͘͢͝େࣄɻ࣮1ߦʹରͯ͠ςετഒͱ͍͏ͷβϥ • ઌʹςετέʔε͔Βॻ͍ͯྑ͍(TDD) 19/51
ྑ͍ςετ • PRͷલʹςετ͕མ͍͕ͪͯͨɺमਖ਼ʹΑͬͯΔΑ͏ͳςε τ͕ཧత • ఆ͞ΕΔΤοδέʔε͍͠ঢ়گ͕ཏ͞Ε͍ͯΔ • Α͍ςετέʔε͕͋ΔͱϨϏϡʔ͞Ε͍͢ɹ 20/51
PRΛग़͢ 21/51
Description • ʮΓ͍ͨ͜ͱʯʮલఏ݅ʯʮͲͷΑ͏ʹղܾ͔ͨ͠ʯʮͦ ͷଞݒ೦ʯ • ςϯϓϨʔτʹԊ͏ͱָ • ແݴPRආ͚Δ 22/51
## Motivation & Context <!-- Ͳ͏͍͏ঢ়گͰ͜Ε͕ى͖Δ͔ --> <!-- ͳͥ͜ͷػೳ͕ඞཁͳͷ͔ɺԿʹࠔ͍ͬͯΔ͔ -->
## Description <!-- ͲͷΑ͏ʹ࣮͔ͨ͠ --> <!-- ͲͷΑ͏ͳέʔεͰಈ࡞֬ೝ͔ͨ͠ --> <!-- Τοδέʔεͳ͍͔ --> 23/51
ϨϏϡʔ͞ΕΔ͖ͱ͜Ζ • ςετέʔεద͔ • Τοδέʔεͳ͍͔ • ঢ়گ͕ཏ͞Ε͍ͯΔʁ • ίʔσΟϯάنൣʹै͍ͬͯΔ͔ •
࣮͔ॴɺϓϩδΣΫτ͝ͱͷنଇ 24/51
Ϛʔδ 25/51
Ϛʔδ͞Ε͍͢PR • ٞͷ༨͕ͳ͍ • MotivationΛ͔ͬ͠Γͱઆ໌͍ͯ͠Δ • ςετಈ࡞֬ೝ͕໌֬ 26/51
αϯϓϧ https://github.com/yonaskolb/XcodeGen/pull/720 27/51
28/51
29/51
ਐΊํ 30/51
՝ • ࣄલʹड़ͨΑ͏ʹωλ୳͕͠ͱ͍ͯ͠ɻ༧Ίணख͢͠ ͍՝Λ͍͔ͭ͘༻ҙͯ͠Έ·ͨ͠ • https://hackmd.io/@giginet/BJQulUAr5 • ͜͜ʹͳ͍issueͪΖΜܴ • ݸਓతʹ๊͍͑ͯΔ՝ײɺڵຯͷ͋ΔOSSͷௐܴࠪ
31/51
ਐΊํ • ωλாΛݟͯɺSlackͰઓ͍ͨ͠issueΛڭ͍͑ͯͩ͘͞ • 1ਓͰྑ͍͠ɺ՝͕ඃͬͨΒదٓνʔϜΛΜͰΑ͍Ͱ ͢ɻϞϒϓϩɺϖΞϓϩܴ 32/51
! ϝϯλʔ • ͷखआΓ์ɻͲΜͲΜฉ͍͍ͯͩ͘͞ • Ͳͷissue͍͍͔ͬͯΘ͔Βͳ͍ʂ • ڥߏஙηοτΞοϓͰ͖ͳ͍ʂ(खݩͰͷ࣮ߦɺσόο Ψʔ) •
࣮ํ๏Θ͔Βͳ͍ʂ • ςετॻ͚ͳ͍ʂ 33/51
() ڥߏங σόοάςΫχοΫ 34/51
iOSϥΠϒϥϦͷςετ • 1. ςετ༻ͷiOSϓϩδΣΫτΛ࡞Δ • 2. Ϋϩʔϯͨ͠ϩʔΧϧϦϙδτϦΛΞϓϦʹΈࠐΉ • SwiftPM •
CocoaPods 35/51
SwiftPM Package Dependencies > + > Add Local Ͱcloneͨ͠σΟϨΫτ ϦΛࢦఆ
36/51
CocoaPods $ git clone https://github.com/ReactiveX/RxSwift.git /path/to/repos/RxSwift pod 'RxSwift', path: '/path/to/repos/RxSwift'
37/51
CLIπʔϧͷςετ(ྫ: XcodeGen) ShellͰͷ࣮ߦɺςετ $ git clone https://github.com/yonaskolb/XcodeGen.git $ cd XcodeGen
$ swift build $ swift test $ swift run xcodegen --help 38/51
• ͘͠XcodeͰϏϧυͨ͠όΠφϦΛShell͔Β࣮ߦͯ͠ྑ ͍ • Products > Show Build Folder in
FinderͰόΠφϦͷҐஔ͕ Θ͔Δ 39/51
XcodeͰσόοΨʔʹଓ͢Δ 1. Debug > Attach to Process by ID ͰίϚϯυ໊ΛೖΕΔ
2. Edit Scheme > Arguments Passed on Launch 3. Run 40/51
41/51
XcodeͷRunϘλϯ͔ΒҾΛ͢ XcodeͰͷ࣮ߦ࣌ʹίϚϯυϥΠϯҾΛ͢͜ͱͰ͖Δɻ࠷ ॳ͔ΒσόοΨʔ͕ܨ͕Γ։ൃ͍͢͠ • xcodegen > Edit Scheme > Arguments
Passed On Launch. 42/51
43/51
ShellΛͬͨςετڥͷ࡞Γํ(ྫ: swift- argument-parser) 44/51
։ൃ͍ͨ͠ύοέʔδΛclone $ git clone https://github.com/apple/swift-argument-parser.git 45/51
։ൃ༻ϓϩδΣΫτͷ࡞ $ mkdir oss-forward-workshop $ cd oss-forward-workshop $ swift package
init 46/51
ϓϩδΣΫτΛXcodeͰ։͘ Xcode > Open͔Β oss-forward-workshop Λ։͘ 47/51
Package.swift • cloneͨ͠ϩʔΧϧύεΛ Package.swift ʹهड़ • ςετ༻ͷexecutableΛՃ // swift-tools-version: 5.6
// The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription let package = Package( name: "oss-forward-workshop", products: [ .executable(name: "oss-forward-workshop", targets: ["oss-forward-workshop"]) ], dependencies: [ .package(name: "swift-argument-parser", path: "/path/to/repo/swift-argument-parser"), ], targets: [ .target(name: "oss-forward-workshop", dependencies: [ .product(name: "ArgumentParser", package: "swift-argument-parser"), ]) ] ) 48/51
Package.swift • cloneͨ͠ϩʔΧϧύεΛ Package.swift ʹهड़ • ςετ༻ͷexecutableΛՃ // swift-tools-version: 5.6
// The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription let package = Package( name: "oss-forward-workshop", products: [ .executable(name: "oss-forward-workshop", targets: ["oss-forward-workshop"]) ], dependencies: [ .package(name: "swift-argument-parser", path: "/path/to/repo/swift-argument-parser"), ], targets: [ .target(name: "oss-forward-workshop", dependencies: [ .product(name: "ArgumentParser", package: "swift-argument-parser"), ]) ] ) 48/51
oss-forward-workshop/main.swift import ArgumentParser struct MyCommand: ParsableCommand { static var configuration
= CommandConfiguration( commandName: "my-command", abstract: "My first command", discussion: "Hello", version: "1.0.0", shouldDisplay: true, helpNames: [.long, .short] ) func run() throws { print("Hello, World!") } } MyCommand.main() 49/51
$ swift run oss-forward-workshop --help OVERVIEW: My first command Hello
USAGE: my-command OPTIONS: --version Show the version. -h, --help Show help information. 50/51
ͦͷଞ • ྺ࢙ͷ͋Δπʔϧ (fastlane/CocoaPods/danger/xcprettyͳͲ) RubyͰॻ͔Ε͍ͯΔ͜ͱ͕ଟ͘ɺRuby։ൃͷσόοάख๏͕ ʹཱͭ • pry, rspec, rubygems
• ઓ͢Δํฉ͍͍ͯͩ͘͞ 51/51