サーバサイドSwiftの現状考察 #tryswiftconf

  • 13
    いいね
  • 0
    コメント

厳密にはSwiftをLinuxで動かすとどうなのという話です

try! Swift 2017の復習

SwiftのWeb APIとアプリをともに構築する / Building a Swift Web API and Application Together → niwatakoさんのブログ
様々な場面でSwiftを使う / Swift Outside the Box
サーバサイドSwiftの実例 / Server-Side Swift Live Coding → niwatakoさんのブログ

SwiftをLinux上で動かす

tar.gz

もしくは

Docker

依存物がそこそこあるのでDockerが楽。

注意するところなど

対応OS

3.0.2(今の最新のリリース版)だとUbuntu 16.04かUbuntu 14.04指定。
3.1(スナップショット版)だとUbuntu 16.10用の物もある。

ラズパイ対応のものもあるらしい。が、こちらもOSはRaspbianではなくUbuntuでないとダメな模様。
Swift 3.0 on Raspberry Pi 2 and 3
Building Swift 3.0 on a Raspberry Pi 3
uraimo/SwiftyGPIO: A Swift library to interact with Linux GPIO/SPI on ARM (RaspberryPi, BeagleBone, CHIP, etc...)

CoreFoundation

リポジトリ: https://github.com/apple/swift-corelibs-foundation

Mac上で呼ばれるいつものFoundationと違い、Swift on Linuxで呼ばれるFoundationは未完成。

例えばSwift3.0.2で

import Foundation

URLSession.shared

とやると、実行時に fatal error: shared is not yet implemented: file Foundation/NSURLSession/NSURLSession.swift, line 200 とされてしまう。
swift-3.0-branchの該当箇所を覗いてみると、確かに NSUnimplemented() の文字が。

一応URLSession.initは存在しているので、引数を与えれば取れないことはない。

import Foundation

URLSession(configuration: URLSessionConfiguration())

現状未完成のURLSessionを取ったところで何かが変わるというわけでもないが。

進捗状況はリポジトリ内のDocsから確認することができる。
https://github.com/apple/swift-corelibs-foundation/blob/master/Docs/Status.md

対応策としては、自作するか、無難に先人が作ったライブラリを探してきてやりたいことを実現できるか検討することになる。要はFoundationに依存しないSwiftライブラリであったりCライブラリであったりを探さなければならない。

なお、Swift Outside the Boxを発表されたnovi_さんがURLSessionを採用しなかったのは、クローラに必要な細かい操作をやるのにURLSessionでは厳しかったからとのこと。

Cライブラリ

Swift Package ManagerはCライブラリを呼ぶことができる。
https://github.com/apple/swift-package-manager/blob/master/Documentation/Usage.md#require-system-libraries

しかしその実態は
「Cライブラリのリンクを持つモジュールを別パッケージのかたちで 自作して 呼ぶ」
というもの。各開発者が独自に作成できてしまうので、モジュール名の衝突が発生する恐れがある。最終的には同じライブラリを呼ぶのに。

例えばGitHubでCCurlを検索するとIBM-Swift/CCurlを筆頭に大量のcURLが存在しているのがわかる。使いたいライブラリ群がそれぞれ別のCCurlを呼んでいた場合、CCurlというモジュール名が衝突して両立できない事態に陥る。

まとめ

Foundationの実装待ち、開発者間の共通ルールや認識の確定待ちの部分があるので注意。
Webアプリフレームワーク界隈では開発者間で話し合いが持たれているらしいが、果たして。

サーバサイド事情を教えてくださったみなさまありがとうございました!