Windows10のUbuntu18.04でSwift 5.2.1とVapor 4.0.0へアップデート

#環境をアップデートします。

[以前](https://qiita.com/ArimitsuIshii/items/f29a24fd15e2a511dcf0)の環境はノートPCと共にお亡くなりになりましたが、再度同環境を構築してVaporの動作を確認していました。しかしながらテンプレートがどうも上手く動かないようで、どうせ調べるなら最新がいいなぁと思いVapor４系に更新することにしました。

#Swift 5.2.1
Vapor４系はSwift5.2以上が必要なので、まずSwiftを更新します。
タイムリーなことに、2020年3月30日に5.2.1がリリースされていました。

[Ubuntu 18.04用](https://swift.org/builds/swift-5.2.1-release/ubuntu1804/swift-5.2.1-RELEASE/swift-5.2.1-RELEASE-ubuntu18.04.tar.gz)をダウンロードして展開します。

5.1.5の時と同じように/usr/local下へコピーしてパスを通します。

.bashrcを編集

```
#export PATH=/usr/local/swift-5.1.5-RELEASE-ubuntu18.04/usr/bin:$PATH
export PATH=/usr/local/swift-5.2.1-RELEASE-ubuntu18.04/usr/bin:$PATH
```

ダメだった時に備えて、Swift5.1.5も残しておきます。

```
source .bashrc
swift --version
```

![swift5.2.1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/47e50a7f-7f75-d954-572e-d3f89bf6164e.png)

Swift5.2.1が使えるようになりました。

#Vapor４
[Vapor4.0のヘルプ](https://docs.vapor.codes/4.0/install/ubuntu/)を見ながらVapor Toolboxをインストールします。

githubから取ってきて、ビルドします。

```
git clone https://github.com/vapor/toolbox.git
cd toolbox
git checkout　は最新を使うのでやらない
swift build -c release --disable-sandbox
```

エラー

```
Fetching https://github.com/tanner0101/mustache.git
Fetching https://github.com/apple/swift-log.git
Fetching https://github.com/vapor/console-kit.git
Fetching https://github.com/apple/swift-nio.git
Fetching https://github.com/jpsim/Yams.git
Cloning https://github.com/jpsim/Yams.git
Resolving https://github.com/jpsim/Yams.git at 2.0.0
Cloning https://github.com/vapor/console-kit.git
Resolving https://github.com/vapor/console-kit.git at 4.0.0-rc.1
Cloning https://github.com/apple/swift-nio.git
Resolving https://github.com/apple/swift-nio.git at 2.15.0
Cloning https://github.com/apple/swift-log.git
Resolving https://github.com/apple/swift-log.git at 1.2.0
Cloning https://github.com/tanner0101/mustache.git
Resolving https://github.com/tanner0101/mustache.git at 0.1.0
error: missing LinuxMain.swift file in the Tests directory
```

空でもいいという噂もありましたが、LinuxMain.swift をTests下に以下な感じで作ってみます。

```
import XCTest
@testable import MonoGeneratorTests

XCTMain([
     testCase(GeneratorTests.allTests),
])
```

もう一回ビルドすると、なにやらWarningが出てますが、とりあえずvaporは出来ています。

```
/home/arimitsu/toolbox/.build/checkouts/Yams/Sources/Yams/Emitter.swift:338:32: warning: initialization of 'UnsafeMutablePointer<yaml_version_directive_t>' (aka 'UnsafeMutablePointer<yaml_version_directive_s>') results in a dangling pointer
            versionDirective = UnsafeMutablePointer(&versionDirectiveValue)
                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/arimitsu/toolbox/.build/checkouts/Yams/Sources/Yams/Emitter.swift:338:53: note: implicit argument conversion from 'yaml_version_directive_t' (aka 'yaml_version_directive_s') to 'UnsafeMutablePointer<yaml_version_directive_t>' (aka 'UnsafeMutablePointer<yaml_version_directive_s>') produces a pointer valid only for the duration of the call to 'init(_:)'
            versionDirective = UnsafeMutablePointer(&versionDirectiveValue)
                                                    ^~~~~~~~~~~~~~~~~~~~~~
/home/arimitsu/toolbox/.build/checkouts/Yams/Sources/Yams/Emitter.swift:338:53: note: use 'withUnsafeMutablePointer' in order to explicitly convert argument to pointer valid for a defined scope
            versionDirective = UnsafeMutablePointer(&versionDirectiveValue)
                                                    ^
[22/22] Linking vapor
```

./.build/release下に出力された vapor を/usr/local/binの下へコピーしてヘルプを表示して確認する。

```
vapor --help
```

![vapor-help.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/8484f0f2-143a-2717-c3c7-742c5b2bc6c8.png)
バージョンの確認はできなくなったらしい。

```
vapor --version　これは無し
```

#プロジェクト作成
新規にプロジェクトを作ってみます。

```
vapor-beta new hello -n
```
ん？
vapor-betaは無いだろうなぁ
-nはいらないかな

Vapor4.0.0なのでhello「４」の以下でいきます。

```
vapor new hello4
```

Fluentはとりあえず使いませんので「n」で。

```
Cloning template...
name: hello4
Would you like to use Fluent?
y/n> n
fluent: No
Generating project files
+ Package.swift
+ main.swift
+ configure.swift
+ routes.swift
+ .gitkeep
+ AppTests.swift
+ Dockerfile
+ docker-compose.yml
+ .gitignore
+ .dockerignore
Creating git repository
Adding first commit
```

ここでGitのエラーが出るかもしれません。その前にGitのユーザー名とメールアドレスを登録しておきましょう。

```
git config --global user.name [名前]
git config --global user.email [メールアドレス]
```
![hello4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/6682ec9a-d0fb-6b6f-539f-2ea09fe0a5ba.png)
hello4へ移動してbuildします。

```
cd hello4
vapor build
```

core dumped !
![coredump.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/5a4a8407-243f-f50d-af7b-b8588cb88c66.png)
意味不明ですね。

ネットで調べたところ、同じようにコアダンプしている人が質問してました。

* 質問者
「Vaporでビルドするとコアダンプするんだけど、どうしたらいい？」
* 回答者
「Swift試してみた？」
* 質問者
「動いた！」

以上終わり？swiftでいいのかね？

```
swift build
```

![hello4build.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/b13acc5c-ebf3-e252-4116-729bddbb1f7d.png)
またか・・・
上でつくったLinuxMain.swift をTests下にコピーしてやります。

```
swift build
```

![linkingrun.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/db275cb6-6abe-5dec-45d5-ac757bac22f8.png)

できた！

```
swift run
```
![swiftrun.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/ab350ffa-d033-34b5-bcd9-b78e28206d47.png)

ブラウザからも動作を確認できました。

![ブラウザ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/887ca91d-446c-1576-3b22-95fe373050ee.png)

#途中でいろいろやったこと
ネットで調べてやってみましたがが、とりあえず必要なかったです。
###Package.swift
プラットフォーム指定がmacOSだからダメなんじゃないの？でコメントアウト
![platform.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/c39895e5-db19-95f7-6be4-83b66d052325.png)
dependenciesで指定しているパッケージのfromが最新のものを固定で指定してみる
![package.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/e91bfa54-00a6-784a-2f48-980e81ba924e.png)
###toolbox
toolboxのPackage.swiftでも、同様にやってみる。

toolboxのビルドで-Xswiftcをつけてみる、-g（何これ？）をつけてみる

#最後に
ビルドのWarningが気になりますがerrorではないので致命的ではないし、とりあえず動くようにはなりましたので、テンプレートの確認に戻ります。
動くのかな？