書いて覚えるSwift入門

第38回 Swift Package Manager

この記事を読むのに必要な時間:およそ 4 分

ライブラリを使う――ローカル編

今度はそれをほかから使ってみましょう。

$ cd ../

でFizzBuzzディレクトリを抜けたら,今度はFizzBuzzRunというディレクトリを作成しそこにパッケージを生成します。

$ mkdir FizzBuzzRun
$ cd FizzBuzzRun
$ swift package init --type=executable

--type=executableに注目。デフォルトだとlibraryで,上記のとおりライブラリモジュールが作成されたのですが,今度はそのライブラリを使った実行ファイルを作成するというわけです。

ここで,生成されたPackage.swiftファイルを編集します。これこそがSwift Package Managerの心臓部。空([])だったdependencies:に,

dependencies: [
  .package(url: "../FizzBuzz", from:"0.0.0")
]

を追加し,.targetの中に"FizzBuzz"を追加します。

.target(
            name: "FizzBuzzRun",
            dependencies: ["FizzBuzz"]),

これで,main.swiftimport FizzBuzzする準備が整いました。

Sources/FizzBuzzRun/main.swiftをこう書き換えます。

import FizzBuzz
_ = (1...30).map{ print($0.fizzbuzz) }

あとはswift runするだけです図4)⁠

図4 FizzBuzzの実行

% swift run
Fetching /Users/dankogai/Desktop/swift-38/FizzBuzz
Cloning /Users/dankogai/Desktop/swift-38/FizzBuzz
Resolving /Users/dankogai/Desktop/swift-38/FizzBuzz at 0.0.0
Compile Swift Module 'FizzBuzz' (1 sources)
Compile Swift Module 'FizzBuzzRun' (1 sources)
Linking ./.build/x86_64-apple-macosx10.10/debug/FizzBuzzRun
1
2
Fizz
4
Buzz
 ……(中略)……
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz

ライブラリを使う――リモート編

簡単ですね。しかし簡単とは言っても,単にFizzBuzzする程度であればswiftファイル1つあれば事足りますし,必要なことを,すべてそこに書いてもTerminalの画面1つに余裕で収まります。

ではこれをもとにFizzBuzzするWebサーバを作りたいとします。http://localhost:8181/0ならFizzBuzzhttp://localhost:8181/1なら1……程度の簡単なサーバですが,FizzBuzzは簡単でもサーバはそうは行きません。どうしましょう?

Swift Package Managerはまさにそういうときのためにあるのです。まずはFizzBuzzRun同様にFizzBuzzServerという実行ファイルパッケージを生成します。

$ cd ..
$ mkdir FizzBuzzServer
$ cd FizzBuzzServer
$ swift package init --type=executable

そしてPackage.swiftを編集します。

.package(url: "../FizzBuzz", from: "0.0.0"),
.package(url: "https://github.com/
PerfectlySoft/Perfect-HTTPServer.git", from:"3.0.0"),

このhttps://github.com/PerfectlySoft/Perfect-HTTPServer.gitに,Webサーバを実装するのに必要な機能がすべてそろっているわけです。.targetdependencies:にもその旨を追加しておきましょう。

.target(
          name: "FizzBuzzServer",
          dependencies: ["FizzBuzz","PerfectHTTPServer"]),

あとはmain.swiftを適宜書き換えるだけです。あえて説明抜きで全体をリスト3に示します。

リスト3 Sources/FizzBuzzServer/main.swift

import PerfectLib
import PerfectHTTP
import PerfectHTTPServer
import FizzBuzz

var routes = Routes()
routes.add(method: .get, uri: "/**") { q, r in
    if let n = Int(q.path.dropFirst()) {
        r.setBody(string: n.fizzbuzz)
    } else {
        r.status = .notFound
        r.setBody(string: "\(q.path) : not found")
    }
    r.completed()
}

try! HTTPServer.launch(name: "localhost", port: 8181, routes: routes)

Ruby on RailsやPHPのLaravelを使っている人であれば,なんとなくやっていることはおわかりいただけるのではないでしょうか。では実行してみましょう。

swift run
[INFO] Starting HTTP server localhoston :::8181

Port 8181が待ち受け状態になりました。この状態で適当なブラウザでhttp://localhost:8181/0にアクセスしてみましょう。FizzBuzzと表示されましたか?

Swiftからもアクセスしてみましょう。URLにアクセスしてその中身を表示する程度であれば,Swift Package Managerに頼らずともリスト4のような感じで書けます。

リスト4 zzbuzzclient.swift

import Foundation

for n in (1...30) {
    let url = URL(string:"http://localhost:8181/\(n)")!
    let str = try! String(contentsOf:url)
    print(str)
}

そうそう。Webサーバを止めなければいけませんね。通常のシェルプログラム同様,⁠Ctrl]⁠-⁠C」で止まります。

次回予告

というわけで駆け足でSwift Package Managerを使ってみました。{cpan,pip,gem,npm}のユーザであれば見よう見まねで使える気がしてきたのではないでしょうか? 次回のWWDC特集をはさんで,次々回以降ふただびSwift Package Managerを取り上げます。

Software Design

本誌最新号をチェック!
Software Design 2019年6月号

2019年5月17日発売
B5判/176ページ
定価(本体1,220円+税)

  • 第1特集
    仕事に役立つ実例で使いどころがわかる
    思わず実践したくなるシェル&シェルスクリプト
  • 第2特集
    IT業界ビギナーのためのDocker+k8s入門講座[Docker編]
    図解で深く理解して最先端にキャッチアップ!
  • 特別企画
    クラウドへのルータ接続実践ノウハウ
    【1】AWSとオンプレミスをつなごう
  • 一般記事
    「WebAuthn」が導く新時代のパスワードレス認証
    【前編】FIDOとWebAuthnが変えるもの
  • 一般記事
    チームを成長させるコードレビューの秘訣
    漠然と読んであいまいにコメントするのはもうやめよう
  • 短期連載
    Mattermost[導入+構築]入門
    【3】ご存じですか? chat導入のメリット

著者プロフィール

小飼弾(こがいだん)

1969年生まれ,東京都出身。元ライブドア取締役の肩書きよりも,最近はPokemon GOのガチトレーナーのほうが有名になりつつある……かもしれない永遠のエンジニアオヤジ。

活躍の場はIT業界だけでなく,サブカルからアカデミックまで多方面にわたり,ネットからの情報発信は気の向くまま毎日毎秒! https://twitter.com/dankogai,ニコニコチャンネルは,http://ch.nicovideo.jp/dankogai,blogはhttp://blog.livedoor.jp/dankogai/

当社刊行書籍は『小飼弾のアルファギークに逢ってきた』『小飼弾のコードなエッセイ』など。他にも著書多数。