Ubuntu 16.04にSwift4をインストールしてVaporでハローワールドするまで #love_swift


[Swift愛好会合宿 2018/1/20-1/21](https://love-swift.connpass.com/event/72804/)で記事書いてます。 #love_swift

## 筆者スペック

* 普段はNode.jsを書いている
* SwiftはServer Side Swiftを1年くらい前にさわった程度です

ということでSwift書いてるというより環境構築復習くらいですがメモしておきます。

## 環境

* Ubuntu 16.04
* Swift 4.0.3
* Vapor 2.4.0

## 現在の最新バージョンを確認

どこの言語でもそうですけど最新バージョンしりたいですよね。

https://swift.org/download/#releases

2018年1月20日現在の最新は **4.0.3**らしい。

![](https://i.gyazo.com/5549b91e7db12a9741bed32e40b2d7e9.png)


## Ubuntuにインストールする

Ubuntuのバージョンを確認

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"
```

**16.04**でした。

## ツールのインストール

[Ubuntu16.04 に Swift4 をインストールして、swift package を簡単に使ってみる](http://techlog.takuyachallenge.me/entry/2017/11/13/105836)を参考にインストール

```
$ sudo apt-get install clang libpython2.7 libxml2
```

## Swiftのインストール

4.0.3をDL

```
$ wget https://swift.org/builds/swift-4.0.3-release/ubuntu1604/swift-4.0.3-RELEASE/swift-4.0.3-RELEASE-ubuntu16.04.tar.gz
```

```
$ tar zxfv swift-4.0.3-RELEASE-ubuntu16.04.tar.gz
```

```
$ sudo mv swift-4.0.3-RELEASE-ubuntu16.04 /usr/local/swift
```

パスを通す。

確認

```
$ swift --version
Swift version 4.0.3 (swift-4.0.3-RELEASE)
Target: x86_64-unknown-linux-gnu
```

無事に

## Swift Packageでエラー

```
$ swift package init --type executable
/usr/local/swift/usr/bin/swift-package: error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory
```

[Electron apps can't find libcurl.so.4](https://github.com/electron/electron/issues/8853)で解決しました。

```
$ sudo apt-get install curl libcurl3
```

## 改めて Swift Package

myswiftというフォルダを作成して作業します。

```
$ mkdir myswift
$ cd myswift
```

```
$ swift package init --type executable
Creating executable package: myswift
Creating Package.swift
Creating README.md
Creating .gitignore
Creating Sources/
Creating Sources/myswift/main.swift
Creating Tests/
```

これでHello World的なプロジェクトができます。

ビルドしてみます。

```
$ swift build
Compile Swift Module 'myswift' (1 sources)
Linking ./.build/x86_64-unknown-linux/debug/myswift
```

`./.build/x86_64-unknown-linux/debug/myswift`という実行ファイルができました。

## 実行

```
$ ./.build/x86_64-unknown-linux/debug/myswift
Hello, world!
```

ここまでそこまで詰まらずにいけました。

さて...

## VaporでWebサーバーを立ててみる

Webフレームワーク何個かあるけど、なんとなく使ってみます。

https://docs.vapor.codes/2.0/

```
$ mkdir webapp
$ cd webapp
$ swift package init --type executable
```

[Manual Quickstart](https://docs.vapor.codes/2.0/getting-started/manual/)を参考に進めます。

`Sources/webapp/main.swift`を編集

```main.swift

import Vapor

let drop = try Droplet()

drop.get("hello") { req in
  return "Hello Vapor"
}

try drop.run()

```

`Package.swift`を編集。

```Package.swift
// swift-tools-version:4.0
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "webapp",
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        .package(url: "https://github.com/vapor/vapor.git", from: "2.4.0"),
    ],
    targets: [
        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
        // Targets can depend on other targets in this package, and on products in packages which this package depends on.
        .target(
            name: "webapp",
            dependencies: ["Vapor"]),
    ]
)
```

ビルド

```
$ swift build
```

結構時間かかります。

```
Compile CHTTP http_parser.c
Compile Swift Module 'libc' (1 sources)
Compile Swift Module 'Debugging' (1 sources)
Compile Swift Module 'Bits' (19 sources)
Compile Swift Module 'PathIndexable' (2 sources)
Compile Swift Module 'Core' (23 sources)
Compile Swift Module 'Transport' (10 sources)
Compile Swift Module 'Random' (6 sources)
Compile Swift Module 'Node' (38 sources)
Compile Swift Module 'Console' (36 sources)
Compile Swift Module 'URI' (6 sources)
Compile Swift Module 'Sockets' (22 sources)
Compile Swift Module 'Crypto' (13 sources)
Compile Swift Module 'BCrypt' (9 sources)
Compile Swift Module 'Cache' (2 sources)
Compile Swift Module 'Branches' (3 sources)
Compile Swift Module 'JSON' (8 sources)
Compile Swift Module 'TLS' (12 sources)
Compile Swift Module 'SMTP' (21 sources)
Compile Swift Module 'Configs' (13 sources)
Compile Swift Module 'HTTP' (45 sources)
Compile Swift Module 'WebSockets' (14 sources)
Compile Swift Module 'Cookies' (11 sources)
Compile Swift Module 'Multipart' (6 sources)
Compile Swift Module 'Routing' (10 sources)
Compile Swift Module 'Sessions' (7 sources)
Compile Swift Module 'FormData' (4 sources)
Compile Swift Module 'Vapor' (100 sources)
Compile Swift Module 'webapp' (1 sources)
Linking ./.build/x86_64-unknown-linux/debug/webapp
```

WebSocketとかSessionとか色々と落として来てますね。

無事にビルドできました。実行します。

```
$ ./.build/x86_64-unknown-linux/debug/webapp

Could not load config files from: /home/n0bisuke/myswift/webapp/Config/
Try using the configDir flag
ex: .build/debug/Run --configDir=/absolute/path/to/configs
The default hash should be replaced before using in production.
The default cipher should be replaced before using in production.
No command supplied, defaulting to serve...
Starting server on 0.0.0.0:8080
```

これでサーバーが起動します。

`:8080/hello`にアクセスします。

![](https://i.gyazo.com/35fabc2e8b86cf79b6d253112cbda8b0.png)

これでWebサーバーが立てられました。

もうちょい色々試してみたかったけど一旦ここまでで...