macOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswift

242 Views

June 21, 18

スライド概要

macOS アプリで使うライブラリーを Swift Package Manager で導入してみたお話です。最初は 2018年4月14日に HAKATA.swift でお話ししたのですけど、無理やり感が強かったので、改めてもっとスマートな方法を探して 2018年6月20日に Swift 愛好会で話してきました。本スライドは HAKATA.swift 編と Swift 愛好会編の両方を記載してあります。

※ Docswell での公開に移行する直前の Slideshare での閲覧数は 683 でした。

profile-image

正統派趣味人プログラマー。プログラミングとは幼馴染です。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

NBD04ΞϓϦͰ 4XJGU1BDLBHF.BOBHFSΛ࢖ͬͯΈΔ ‫۽‬୩༑޺ !FT@LVNBHBJ ୈճ)","5"TXJGUd෱ԬͰ4XJGUͷษ‫ڧ‬ձd ू·Ε4XJGU޷͖ʂ4XJGUѪ޷ձWPM!(T"DBEFNZ

2.

‫۽‬୩༑޺ 5PNPIJSP,VNBHBJ ⾣ 4XJGU‫͢Ͱ͖޷͕ޠݴ‬ʂ ⾣ ΈΜͳͰָ͠Ήษ‫ڧ‬ձ͕େ޷͖Ͱ͢ʂ ⾣ ϓϩάϥϛϯάͷָ͠͞Λ఻͍͖͍͑ͯͨɻ w ωοτϥδΦ w ษ‫ڧ‬ձͷ஍ํ։࠵ w ಉਓࢽଈചձ ⾣ ୲౰Χϥʔ͸ஆ͔͘রΒ͢઱΍͔ͳΦϨϯδ

3.

NPPLNPPLSBEJP NPPL ‫۽‬୩ͱ៸໘͕ϓϩάϥϛϯάίʔυͷ಺͔Β ௌ͑ͯ͘͜Δ੠ʹࣖΛ܏ָ͚ͯ͠ΉϥδΦ ຖ݄ୈ̎ɾୈ̐ ݄༵೔ ʹ഑৴ IUUQLFQDNPPLNPPLSBEJPDPN ⾣ ୈ࿩  ஋‫ࢀͱܕ‬র‫"ͱܕ‬OZ‫ܕ‬ʁ ⾣ ୈ࿩  ϓϩάϥϛϯά‫ؒޠݴ‬ͷ࿈‫ܞ‬ ⾣ ୈ࿩  ٕज़ॻʹ૝͍Λ஘ͤͯ ⾣ ୈ࿩  ϓϩάϥϛϯάΛͲ͏ֶ΅͏ ⾣ ୈ࿩  ύϥμΠϜ ⾣ ୈ࿩  σʔλϕʔε ⾣ ୈ࿩  Τϥʔͱ‫ڐࠂܯ‬༰ͷ‫ڥ‬ ⾣ ୈ࿩  ӈล஋ͱࠨล஋

4.

ΈΜͳͰ 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෮शձ(0JO௕໺r UI⒌ ʜΈΜͳͰ4XJGU෮शձ(0JO෱Ԭr UI⒌ XJUI/4&(

5.

ٕज़‫ܥ‬ಉਓࢽ ࣗඅग़൛ͱಉਓࢽଈചձ

6.

ࠓ‫ޙ‬ͷ‫׆‬ಈ Ҏ߱

7.

΋͘΋ࣥ͘චձ ʙٕज़‫ܥ‬ಉਓࢽʗ঎‫ࢽۀ‬ɾൃදࢿྉɾϒϩάʙ IUUQTUFDICPPLNFFUVQDPOOQBTTDPN ⾣ ʜ΋͘΋ࣥ͘චձˑग़ு൛3&7!ԣ඿ؔ಺ ⾣ ʜ΋͘΋ࣥ͘චձˑग़ு൛3&7!ौ୩ಓ‫ࡔݰ‬ ⾣ ʜ΋͘΋ࣥ͘චձˑग़ு൛3&7!ਆాਆอொ

8.

4XJGU%BZ!‫ؠ‬ख ୌ୔ࢢ*16Πϊϕʔγϣϯηϯλʔ Ҋ಺ਓɿɹɹԼଜҰক͞Μ IUUQTTXJGUEBZDPOOQBTTDPNFWFOU

9.

ίϛοΫϚʔέοτܾఆʂʢ༵ۚç੢çΊ r Bʣ  !౦‫ژ‬ϏοάαΠτ

10.

ۙ‫گ‬ Ҏ߱

11.

ΈΜͳͰ 4XJGU ෮शձ (0JO෱Ԭ തଟᷫԂηϯλʔϓϨΠε

12.

ୈճ)","5"TXJGUࢀՃ തଟᷫԂηϯλʔϓϨΠε ‫ه‬೦ͷָ԰ՖΛଃͬͨʂ ⾣ ⾣ ⾣ ‫۽‬୩༑޺ দ‫ؗ‬େً ਢ౻ຘ

13.

ٕज़ॻయ̐நબམͪˠ͓ख఻͍ࢀՃʂ ΞΩόɾεΫΤΞ ΋͘΋ࣥ͘චձͷ‫࠵ڞ‬ͷ ື઒͞Μʹरͬͯ΋Βͬͯ ͓ख఻͍ࢀՃܾఆ ㊗

14.

ٕज़ॻయ̐৽‫ץ‬ʁ ผ࡭΋͘΋ࣥ͘චձ

15.

χίχί௒ձٞ‫؍‬ཡ ʙ

16.

௒ՎͬͯΈͨ‫؍‬ཡ!χίχί௒ձٞ ʙ

17.

͘͞ΒγϯσϨϥ ҎདྷɺԠԉதʂ ΞΠυϧάϧʔϓ ৽॓ΞΠυϧεςʔδͱळ༿‫ݪ‬ΞΠυϧεςʔδͰ ೔ϥΠϒ‫׆‬ಈத

18.

΋͘΋ࣥ͘චձ̍प೥‫ه‬೦ϐΫχοΫ!ԣ඿ɾࢁԼެԂ  ϐΫχοΫ͚ͩͲɺࣥචλΠϜʂ

19.

 88%$!4BO+PTF ʙ

20.

464)**/'*/*5: +BQBOFTF4VTIJ#BSJO4BO+PTF ϔλ͢Δͱ೔ຊΑΓඒຯ͍͠ͷͰ͸ɻ

21.

࠷ۙ͸ͪΐͬͱ‫׆‬ಈ‫ࢭٳ‬த😘

22.

NBD04ΞϓϦͰ 4XJGU1BDLBHF.BOBHFSΛ࢖ͬͯΈΔ

23.

ઌ೔ͷ)","5"TXJGUʹͯ ͜Μͳ෩ʹ࢖ͬͯΈͨΑʂͱ͍͏࿩Λͨ͠ Šͪΐͬͱແཧ΍Γ‫͕ͨͬ͋ײ‬ҹ৅Š

24.

 1BDLBHFTXJGUͷ࡞੒  1BDLBHFTXJGUΛ௥Ճ  μϛʔͷ4XJGUϑΝΠϧΛ௥Ճ  ύοέʔδϏϧυ༻ͷλʔήοτ࡞੒  $PNNBOE-JOF5PPMλʔήοτΛ௥Ճ  NBD04ΞϓϦʹґଘλʔήοτͱͯ͠ొ࿥  ύοέʔδϏϧυ༻ͷεΫϦϓτ࡞੒  NBJOTXJGUΛ࡞੒  ‫ڥ؀‬৘ใͷऔಘ  ύοέʔδΛϏϧυ  ύοέʔδ୯ҐͰϥΠϒϥϦ࡞੒  NBD04ΞϓϦʹϦϯΫ  ϥΠϒϥϦʔΛNBD04ΞϓϦʹϦϯΫ

25.

)","5"TXJGUฤ

26.

 1BDLBHFTXJGUͷ࡞੒

27.

1BDLBHFTXJGUΛ௥Ճ ⾣ ϓϩδΣΫτʹ1BDLBHFTXJGUΛ௥Ճ ⾣ ύοέʔδ໊ͱಉ͡μϛʔϑΥϧμʔΛ௥Ճ import PackageDescription let package = Package( name: "SwiftPM", dependencies: [ .Package( url: "https://github.com/ikesyo/Himotoki", majorVersion: 3, minor: 1 ) ] )

28.

μϛʔͷ4XJGUϑΝΠϧΛ௥Ճ ⾣ μϛʔϑΥϧμʔʹ4XJGUϑΝΠϧΛ௥Ճ ⾣ ϑΝΠϧ໊͸޷͖ʹɺத਎͸ۭͰେৎ෉ ˞ύοέʔδͷϏϧυ࣌ʹlϏϧυ͢Διʔείʔυ͕ͳ͍zͱ‫͞ࠂܯ‬Εͳ͍Α͏ʹ͢Δͷ͕໨త

29.

 ύοέʔδϏϧυ༻ͷλʔήοτ࡞੒

30.

$PNNBOE-JOF5PPMλʔήοτΛ௥Ճ ⾣ ίϚϯυϓϩδΣΫτΛ࡞੒ ⾣ ͜͜Ͱ4XJGUύοέʔδΛϏϧυ͢Δ

31.

NBD04ΞϓϦʹґଘλʔήοτͱͯ͠ొ࿥ ⾣ NBD04ΞϓϦͷλʔήοτͷ#VJME1IBTFTʹొ࿥ ⾣ 5BSHFU%FQFOEFODJFTʹύοέʔδϏϧυ༻ͷλʔήοτΛొ࿥ ˞NBD04ΞϓϦΛϏϧυ͢Δͱ͖ʹɺύοέʔδϏϧυ༻ͷλʔήοτ΋Ϗϧυ͞ΕΔΑ͏ʹ͢Δ

32.

 ύοέʔδϏϧυ༻ͷεΫϦϓτ࡞੒

33.

NBJOTXJGUΛ࡞੒ ⾣ $PNNBOE-JOF5PPMͷNBJOTXJGU಺ʹεΫϦϓτΛ‫ࡌه‬ ⾣ 4XJGUͰॻ͔ͳͯ͘΋ྑ͍͚ΕͲɺ͔ͤͬ͘ͳͷͰ4XJGUͰ‫ࡌه‬ // 少し長くなるので // 次ページ以降のスライドでコードを紹介

34.

‫ڥ؀‬৘ใͷऔಘ 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͔Β࣮ߦ͢Δ͜ͱͰɺผλʔήοτͷ‫ڥ؀‬ม਺ΛऔಘՄೳ

35.

ύοέʔδΛϏϧυ 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()

36.

ύοέʔδ୯ҐͰϥΠϒϥϦ࡞੒ for buildPath in try! FileManager.default .contentsOfDirectory(atPath: configurationBuildDir) where buildPath.hasSuffix(".build") { // ここでパッケージ単位で、 // バイナリファイルをライブラリ化する // // 次のスライドのコードを参照 }

37.
[beta]
όΠφϦʔ͔ΒϥΠϒϥϦʔΛੜ੒
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()

38.

 NBD04ΞϓϦʹϦϯΫ

39.

ϥΠϒϥϦʔΛNBD04ΞϓϦʹϦϯΫ ⾣ 0UIFS-JOLFS'MBHTͰϥΠϒϥϦʔΛࢦఆ ⾣ -JCSBSZ4FBSDI1BUITͰϥΠϒϥϦʔͷ৔ॴΛࢦఆ

40.

‫׬‬੒ ͨͩ͠ɺ͜͜ʹ‫͡ײ‬Δ՝୊  ‫ؤ‬ுΓա͍͗ͯΔΑ͏ͳ‫͕͢ؾ‬Δ  ࣄ࣮ʹґଘ͠ա͍͗ͯΔ  ෳ਺ͷλʔήοτͰϥΠϒϥϦʔΛ࢖͍͍ͨͱ͖ ͦΕΒશ෦ͷ3VO4DSJQUͰ࠶Ϗϧυ͢Δʁ

41.

4XJGU-BCͰฉ͍ͯΈΔʁ

42.

 88%$!4BO+PTF 4XJGU0QFO)PVST

43.

4XJGU0QFO)PVST ௒ࠞΜͰΔʜ🤤

44.

🌻 TXJGUQBDLBHF HFOFSBUFYDPEFQSPKΛ࢖ͬͯΈΑ͏ʂ ŠࣗྗͰղܾŠ

45.

ํ޲ੑ  ύοέʔδϏϧυ༻ͷϓϩδΣΫτΛ࡞੒  ύοέʔδͷ਽‫ܗ‬Λ࡞੒  ར༻͍ͨ͠ύοέʔδΛґଘొ࿥  9DPEFϓϩδΣΫτΛࣗಈੜ੒  NBD04ΞϓϦ༻ͷϓϩδΣΫτΛ࡞੒  ύοέʔδϏϧυ༻ͷϓϩδΣΫτΛ αϒϓϩδΣΫτͱͯ͠ొ࿥  NBD04ΞϓϦʹϑϨʔϜϫʔΫΛϦϯΫ

46.

4XJGUѪ޷ձฤ

47.

 ύοέʔδϏϧυ༻ͷϓϩδΣΫτΛ࡞੒

48.

ύοέʔδͷ਽‫ܗ‬Λ࡞੒ ⾣ ύοέʔδ༻ͷσΟϨΫτϦʔΛ࡞੒ ⾣ ͦͷதͰTXJGUQBDLBHFJOJUΛ࣮ߦ mkdir SwiftPM-Modules cd SwiftPM-Modules swift package init

49.

ར༻͍ͨ͠ύοέʔδΛґଘొ࿥ ⾣ 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"] ), ],

50.

9DPEFϓϩδΣΫτΛࣗಈੜ੒ ⾣ TXJGUQBDLBHFHFOFSBUFYDPEFQSPKΛ࣮ߦ ⾣ 1BDLBHFTXJGUΛ‫ʹج‬9DPEFϓϩδΣΫτ͕ੜ੒͞ΕΔ swift package generate-xcodeproj

51.

 NBD04ΞϓϦ༻ͷϓϩδΣΫτΛ࡞੒

52.

αϒϓϩδΣΫτͱͯ͠ొ࿥ ⾣ ύοέʔδϏϧυ༻ͷϓϩδΣΫτΛ αϒϓϩδΣΫτͱͯ͠NBD04ΞϓϦͷϓϩδΣΫτʹొ࿥

53.

NBD04ΞϓϦʹϑϨʔϜϫʔΫΛϦϯΫ ⾣ αϒϓϩδΣΫτʹొ࿥͢Δͱɺ਌ϓϩδΣΫτʹೝࣝ͞ΕΔ ⾣ &NCFE'SBNFXPSLT΍-JOL#JOBSZ8JUI-JCSBSJFTʹొ࿥

54.

‫׬‬੒ ΤϨΨϯτͳҹ৅  4XJGU1BDLBHF.BOBHFSͷඪ४‫ػ‬ೳ͚ͩͰϥΠϒϥϦʔੜ੒  9DPEFͷඪ४‫ػ‬ೳ͚ͩͰϥΠϒϥϦʔΛϦϯΫ  ෳ਺ͷλʔήοτͰ΋ඪ४‫ػ‬ೳ͚ͩͰରԠՄೳ

55.

4XJGU1BDLBHF.BOBHFS NBD04ΞϓϦͰ‫🌻 ͏͚͍ͦͯͬ࢖ʹܰؾ‬

56.

&OKPZ4XJGU 5IBOLZPV ‫۽‬୩༑޺ !FT@LVNBHBJ