厳密にはSwiftをLinuxで動かすとどうなのという話です
try! Swift 2017の復習
SwiftのWeb APIとアプリをともに構築する / Building a Swift Web API and Application Together → [niwatakoさんのブログ]
(http://niwatako.hatenablog.jp/?page=1488442126)
様々な場面でSwiftを使う / Swift Outside the Box
サーバサイドSwiftの実例 / Server-Side Swift Live Coding → niwatakoさんのブログ
SwiftをLinux上で動かす
tar.gz
- 公式の説明: https://swift.org/download/#installation-1
- Vaporの説明: https://vapor.github.io/documentation/getting-started/install-swift-3-ubuntu.html
もしくは
依存物がそこそこあるので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アプリフレームワーク界隈では開発者間で話し合いが持たれているらしいが、果たして。
サーバサイド事情を教えてくださったみなさまありがとうございました!