242 Views
June 21, 18
スライド概要
macOS アプリで使うライブラリーを Swift Package Manager で導入してみたお話です。最初は 2018年4月14日に HAKATA.swift でお話ししたのですけど、無理やり感が強かったので、改めてもっとスマートな方法を探して 2018年6月20日に Swift 愛好会で話してきました。本スライドは HAKATA.swift 編と Swift 愛好会編の両方を記載してあります。
※ Docswell での公開に移行する直前の Slideshare での閲覧数は 683 でした。
正統派趣味人プログラマー。プログラミングとは幼馴染です。
NBD04ΞϓϦͰ 4XJGU1BDLBHF.BOBHFSΛͬͯΈΔ ۽୩༑ !FT@LVNBHBJ ୈճ)","5"TXJGUdԬͰ4XJGUͷษڧձd ू·Ε4XJGU͖ʂ4XJGUѪձWPM!(T"DBEFNZ
۽୩༑ 5PNPIJSP,VNBHBJ ⾣ 4XJGU͢Ͱ͖͕ޠݴʂ ⾣ ΈΜͳͰָ͠Ήษڧձ͕େ͖Ͱ͢ʂ ⾣ ϓϩάϥϛϯάͷָ͠͞Λ͍͖͍͑ͯͨɻ w ωοτϥδΦ w ษڧձͷํ։࠵ w ಉਓࢽଈചձ ⾣ ୲Χϥʔஆ͔͘রΒ͔͢ͳΦϨϯδ
NPPLNPPLSBEJP NPPL ۽୩ͱ៸໘͕ϓϩάϥϛϯάίʔυͷ͔Β ௌ͑ͯ͘͜ΔʹࣖΛָ͚ͯ͠ΉϥδΦ ຖ݄ୈ̎ɾୈ̐ ݄༵ ʹ৴ IUUQLFQDNPPLNPPLSBEJPDPN ⾣ ୈ ࢀͱܕর"ͱܕOZܕʁ ⾣ ୈ ϓϩάϥϛϯάؒޠݴͷ࿈ܞ ⾣ ୈ ٕज़ॻʹ͍Λͤͯ ⾣ ୈ ϓϩάϥϛϯάΛͲ͏ֶ΅͏ ⾣ ୈ ύϥμΠϜ ⾣ ୈ σʔλϕʔε ⾣ ୈ Τϥʔͱڐࠂܯ༰ͷڥ ⾣ ୈ ӈลͱࠨล
ΈΜͳͰ 4XJGU ෮शձ(0 ʜΈΜͳͰ4XJGU෮शձ(0JOࡳຈr TU⒌ ʜΈΜͳͰ4XJGU෮शձ(0JOԭೄr OE⒌ 4XJGU%BZ ʜΈΜͳͰ4XJGU෮शձ(0JOઋr SE⒌ ʜΈΜͳͰ4XJGU෮शձ(0JOԬr UI⒌ 4XJGU%BZ ʜΈΜͳͰ4XJGU෮शձ(0JOԬr UI⒌ ʜΈΜͳͰ4XJGU෮शձ(0JOژr UI⒌ ʜΈΜͳͰ4XJGU෮शձ(0JOr UI⒌ ʜΈΜͳͰ4XJGU෮शձ(0JOԬr UI⒌ XJUI/4&(
ٕज़ܥಉਓࢽ ࣗඅग़൛ͱಉਓࢽଈചձ
ࠓޙͷ׆ಈ Ҏ߱
ࣥ͘͘චձ ʙٕज़ܥಉਓࢽʗࢽۀɾൃදࢿྉɾϒϩάʙ IUUQTUFDICPPLNFFUVQDPOOQBTTDPN ⾣ ʜࣥ͘͘චձˑग़ு൛3&7!ԣؔ ⾣ ʜࣥ͘͘චձˑग़ு൛3&7!ौ୩ಓࡔݰ ⾣ ʜࣥ͘͘චձˑग़ு൛3&7!ਆాਆอொ
4XJGU%BZ!ؠख ୌࢢ*16Πϊϕʔγϣϯηϯλʔ ҊਓɿɹɹԼଜҰক͞Μ IUUQTTXJGUEBZDPOOQBTTDPNFWFOU
ίϛοΫϚʔέοτܾఆʂʢ༵ۚççΊ r Bʣ !౦ژϏοάαΠτ
ۙگ Ҏ߱
ΈΜͳͰ 4XJGU ෮शձ (0JOԬ തଟᷫԂηϯλʔϓϨΠε
ୈճ)","5"TXJGUࢀՃ തଟᷫԂηϯλʔϓϨΠε ه೦ͷָՖΛଃͬͨʂ ⾣ ⾣ ⾣ ۽୩༑ দؗେً ਢ౻ຘ
ٕज़ॻయ̐நબམͪˠ͓ख͍ࢀՃʂ ΞΩόɾεΫΤΞ ࣥ͘͘චձͷ࠵ڞͷ ື͞ΜʹरͬͯΒͬͯ ͓ख͍ࢀՃܾఆ ㊗
ٕज़ॻయ̐৽ץʁ ผࣥ͘͘චձ
χίχίձٞ؍ཡ ʙ
ՎͬͯΈͨ؍ཡ!χίχίձٞ ʙ
͘͞ΒγϯσϨϥ ҎདྷɺԠԉதʂ ΞΠυϧάϧʔϓ ৽॓ΞΠυϧεςʔδͱळ༿ݪΞΠυϧεςʔδͰ ϥΠϒ׆ಈத
ࣥ͘͘චձ̍पه೦ϐΫχοΫ!ԣɾࢁԼެԂ ϐΫχοΫ͚ͩͲɺࣥචλΠϜʂ
88%$!4BO+PTF ʙ
464)**/'*/*5: +BQBOFTF4VTIJ#BSJO4BO+PTF ϔλ͢ΔͱຊΑΓඒຯ͍͠ͷͰɻ
࠷ۙͪΐͬͱ׆ಈࢭٳத😘
NBD04ΞϓϦͰ 4XJGU1BDLBHF.BOBHFSΛͬͯΈΔ
ઌͷ)","5"TXJGUʹͯ ͜Μͳ෩ʹͬͯΈͨΑʂͱ͍͏Λͨ͠ ͪΐͬͱແཧΓ͕ͨͬ͋ײҹ
1BDLBHFTXJGUͷ࡞ 1BDLBHFTXJGUΛՃ μϛʔͷ4XJGUϑΝΠϧΛՃ ύοέʔδϏϧυ༻ͷλʔήοτ࡞ $PNNBOE-JOF5PPMλʔήοτΛՃ NBD04ΞϓϦʹґଘλʔήοτͱͯ͠ొ ύοέʔδϏϧυ༻ͷεΫϦϓτ࡞ NBJOTXJGUΛ࡞ ڥใͷऔಘ ύοέʔδΛϏϧυ ύοέʔδ୯ҐͰϥΠϒϥϦ࡞ NBD04ΞϓϦʹϦϯΫ ϥΠϒϥϦʔΛNBD04ΞϓϦʹϦϯΫ
)","5"TXJGUฤ
1BDLBHFTXJGUͷ࡞
1BDLBHFTXJGUΛՃ ⾣ ϓϩδΣΫτʹ1BDLBHFTXJGUΛՃ ⾣ ύοέʔδ໊ͱಉ͡μϛʔϑΥϧμʔΛՃ import PackageDescription let package = Package( name: "SwiftPM", dependencies: [ .Package( url: "https://github.com/ikesyo/Himotoki", majorVersion: 3, minor: 1 ) ] )
μϛʔͷ4XJGUϑΝΠϧΛՃ ⾣ μϛʔϑΥϧμʔʹ4XJGUϑΝΠϧΛՃ ⾣ ϑΝΠϧ໊͖ʹɺதۭͰେৎ ˞ύοέʔδͷϏϧυ࣌ʹlϏϧυ͢Διʔείʔυ͕ͳ͍zͱ͞ࠂܯΕͳ͍Α͏ʹ͢Δͷ͕త
ύοέʔδϏϧυ༻ͷλʔήοτ࡞
$PNNBOE-JOF5PPMλʔήοτΛՃ ⾣ ίϚϯυϓϩδΣΫτΛ࡞ ⾣ ͜͜Ͱ4XJGUύοέʔδΛϏϧυ͢Δ
NBD04ΞϓϦʹґଘλʔήοτͱͯ͠ొ ⾣ NBD04ΞϓϦͷλʔήοτͷ#VJME1IBTFTʹొ ⾣ 5BSHFU%FQFOEFODJFTʹύοέʔδϏϧυ༻ͷλʔήοτΛొ ˞NBD04ΞϓϦΛϏϧυ͢Δͱ͖ʹɺύοέʔδϏϧυ༻ͷλʔήοτϏϧυ͞ΕΔΑ͏ʹ͢Δ
ύοέʔδϏϧυ༻ͷεΫϦϓτ࡞
NBJOTXJGUΛ࡞ ⾣ $PNNBOE-JOF5PPMͷNBJOTXJGUʹεΫϦϓτΛࡌه ⾣ 4XJGUͰॻ͔ͳͯ͘ྑ͍͚ΕͲɺ͔ͤͬ͘ͳͷͰ4XJGUͰࡌه // 少し長くなるので // 次ページ以降のスライドでコードを紹介
ڥใͷऔಘ import Foundation let environment = ProcessInfo.processInfo.environment let buildRoot = environment["BUILD_ROOT"]! let configuration = environment["CONFIGURATION"]! let configurationBuildDir = environment["CONFIGURATION_BUILD_DIR"]! ˞͜ΕΒͷڥม$PNNBOE-JOF5PPM୯ମΛ࣮ߦͯ͠औಘͰ͖ͳ͍ͷͰҙ ˞ผλʔήοτͷ3VO4DSJQU͔Β࣮ߦ͢Δ͜ͱͰɺผλʔήοτͷڥมΛऔಘՄೳ
ύοέʔδΛϏϧυ Process.launchedProcess(launchPath: "/usr/bin/swift", arguments: ["package", "--build-path", buildRoot, "resolve"]).waitUntilExit() Process.launchedProcess(launchPath: "/usr/bin/swift", arguments: ["build", "--build-path", buildRoot, "-c", configuration.lowercased()]).waitUntilExit()
ύοέʔδ୯ҐͰϥΠϒϥϦ࡞ for buildPath in try! FileManager.default .contentsOfDirectory(atPath: configurationBuildDir) where buildPath.hasSuffix(".build") { // ここでパッケージ単位で、 // バイナリファイルをライブラリ化する // // 次のスライドのコードを参照 }
όΠφϦʔ͔ΒϥΠϒϥϦʔΛੜ
let packageName = buildPath.dropLast(".build".count)
let packageBuildDir = "\(configurationBuildDir)/\(buildPath)"
let libraryName = "\(configurationBuildDir)/lib\(packageName).a"
let objects = try! FileManager.default
.contentsOfDirectory(atPath: packageBuildDir)
.filter { $0.hasSuffix(".o") }
let process = Process()
process.currentDirectoryPath = packageBuildDir
process.launchPath = "/usr/bin/libtool"
process.arguments = ["-o", libraryName] + objects
process.launch()
process.waitUntilExit()
NBD04ΞϓϦʹϦϯΫ
ϥΠϒϥϦʔΛNBD04ΞϓϦʹϦϯΫ ⾣ 0UIFS-JOLFS'MBHTͰϥΠϒϥϦʔΛࢦఆ ⾣ -JCSBSZ4FBSDI1BUITͰϥΠϒϥϦʔͷॴΛࢦఆ
ͨͩ͠ɺ͜͜ʹ͡ײΔ՝ ؤுΓա͍͗ͯΔΑ͏ͳ͕͢ؾΔ ࣄ࣮ʹґଘ͠ա͍͗ͯΔ ෳͷλʔήοτͰϥΠϒϥϦʔΛ͍͍ͨͱ͖ ͦΕΒશ෦ͷ3VO4DSJQUͰ࠶Ϗϧυ͢Δʁ
4XJGU-BCͰฉ͍ͯΈΔʁ
88%$!4BO+PTF 4XJGU0QFO)PVST
4XJGU0QFO)PVST ࠞΜͰΔʜ🤤
🌻 TXJGUQBDLBHF HFOFSBUFYDPEFQSPKΛͬͯΈΑ͏ʂ ࣗྗͰղܾ
ํੑ ύοέʔδϏϧυ༻ͷϓϩδΣΫτΛ࡞ ύοέʔδͷܗΛ࡞ ར༻͍ͨ͠ύοέʔδΛґଘొ 9DPEFϓϩδΣΫτΛࣗಈੜ NBD04ΞϓϦ༻ͷϓϩδΣΫτΛ࡞ ύοέʔδϏϧυ༻ͷϓϩδΣΫτΛ αϒϓϩδΣΫτͱͯ͠ొ NBD04ΞϓϦʹϑϨʔϜϫʔΫΛϦϯΫ
4XJGUѪձฤ
ύοέʔδϏϧυ༻ͷϓϩδΣΫτΛ࡞
ύοέʔδͷܗΛ࡞ ⾣ ύοέʔδ༻ͷσΟϨΫτϦʔΛ࡞ ⾣ ͦͷதͰTXJGUQBDLBHFJOJUΛ࣮ߦ mkdir SwiftPM-Modules cd SwiftPM-Modules swift package init
ར༻͍ͨ͠ύοέʔδΛґଘొ ⾣ 1BDLBHFTXJGUʹه ⾣ EFQFOEFODJFTͱUBSHFUTʹɺར༻͍ͨ͠ύοέʔδΛࡌه let package = Package( name: "SwiftPM-Modules", products: [ .library( name: "SwiftPM-Modules", targets: ["SwiftPM-Modules"])], dependencies: [ .package(url: "https://github.com/ikesyo/Himotoki", from: "3.1.0") ], targets: [ .target(name: "SwiftPM-Modules", dependencies: ["Himotoki"] ), ],
9DPEFϓϩδΣΫτΛࣗಈੜ ⾣ TXJGUQBDLBHFHFOFSBUFYDPEFQSPKΛ࣮ߦ ⾣ 1BDLBHFTXJGUΛʹج9DPEFϓϩδΣΫτ͕ੜ͞ΕΔ swift package generate-xcodeproj
NBD04ΞϓϦ༻ͷϓϩδΣΫτΛ࡞
αϒϓϩδΣΫτͱͯ͠ొ ⾣ ύοέʔδϏϧυ༻ͷϓϩδΣΫτΛ αϒϓϩδΣΫτͱͯ͠NBD04ΞϓϦͷϓϩδΣΫτʹొ
NBD04ΞϓϦʹϑϨʔϜϫʔΫΛϦϯΫ ⾣ αϒϓϩδΣΫτʹొ͢ΔͱɺϓϩδΣΫτʹೝࣝ͞ΕΔ ⾣ &NCFE'SBNFXPSLT-JOL#JOBSZ8JUI-JCSBSJFTʹొ
ΤϨΨϯτͳҹ 4XJGU1BDLBHF.BOBHFSͷඪ४ػೳ͚ͩͰϥΠϒϥϦʔੜ 9DPEFͷඪ४ػೳ͚ͩͰϥΠϒϥϦʔΛϦϯΫ ෳͷλʔήοτͰඪ४ػೳ͚ͩͰରԠՄೳ
4XJGU1BDLBHF.BOBHFS NBD04ΞϓϦͰ🌻 ͏͚͍ͦͯͬʹܰؾ
&OKPZ4XJGU 5IBOLZPV ۽୩༑ !FT@LVNBHBJ