用 Swift 寫伺服器端

Above發表於2016-07-27

你好,服務端的Swift

自從蘋果公司正式釋出了一個適用於linux的開源版本後,服務端的Swift擁有了令人興奮的前景。我的好奇心終於戰勝了我,是時候嘗試一下服務端的Swift了。

除了很少的BaaS經驗,我沒有其他後端經驗,不過慶幸的是開源社群已經花了很大精力在編寫框架。我花了一些時間試了這些框架,最後決定使用Tanner NelsonVapor。它安裝簡單,很適合我的任務,而且在文件中它顯示了支援Heroku(譯者注:Heroku是一個支援多種程式語言的雲平臺即服務)。我選擇Heroku是因為他是我們後端正在使用它,它對於前端來說很友好。
至寫這篇文章為止,為了能夠在Heroku上正常執行,我(對vapor)做了一些更改並且發起了一個pull request。如果程式碼沒有被合併,你可以使用包管理器在 這裡下載。

安裝

開始之前,你需要一個Heroku賬戶並且安裝Swift Development Snapshot。寫這篇文章的時候,Swift正式版安裝包並沒有包含Swift包管理軟體,為了使用這個工具(Swift包管理軟體),你需要下載開發版的安裝包。

 

開始

我們的目標是啟動一個在Heroku上執行的簡單Swift伺服器,並且這個伺服器能返回hello。 不需要執行在linux環境中,它就像使用本地伺服器。這意味著(只需要)建立一個本地Xcode工程並且配置它,再在 swift package manager中執行它。包含4個主要步驟:

將main.swift檔案移動到Sources資料夾的頂層

用 Swift 寫伺服器端

增加 Package.swift檔案

用 Swift 寫伺服器端

增加 .build目錄到import paths
要使我們匯入的框架獲得自動補全和語法高亮,swift package manager的編譯目錄需要新增到import paths 。確認在debug設定中匯入了debug資料夾,release設定則匯入release資料夾。
用 Swift 寫伺服器端

使用toolchain 執行 Xcode

如果你使用 Xcode 7.3,你可以用 Xcode > Toolchains 選單開啟一個Xcode 例項,來使用 swift snapshot。 需要注意的是即使做了以上的操作,我們還是不能在Xcode裡面編譯,需要使用swift build命令在命令列(終端)中編譯。
用 Swift 寫伺服器端

建立伺服器

僅僅需要寫很少的程式碼就可以啟動和執行來驗證某個想法,這讓我很驚喜。用來小於10行的程式碼,我把伺服器啟動並執行了。
用 Swift 寫伺服器端

這裡使用命令列在終端啟動並執行服務。

用 Swift 寫伺服器端

目前為止看起來不錯,讓我們在瀏覽器中檢查一下。你螢幕上的顯示看起來可能和我的不同,因為我使用了json formatter plugin這個外掛(譯者注:一款chrome外掛,能夠讓json資料格式化顯示)。
用 Swift 寫伺服器端

部署到雲伺服器

本地配置伺服器看起來比較順利,但是如果能遠端部署就更酷啦。我迫切的希望把這個app部署在那個(Heroku)雲服務上面。這對我來說是未知領域,幸運的是我從Vincent Toms那裡找了一些極好的指南幫助我解決了很多問題。
Heroku部署令人有愉快的體驗,幾分鐘之內我就把我的app部署上了,我的toolbelt安裝上了,我已經準備好提交我的專案了。

失敗

這是今天諸多失敗之一。我意料到事情不會如此的順利,我去檢視vapor的文件,最後目光停留在那些名為 buildpacks的新奇東西上。Heroku提供了一些標準的現成的buildpacks,不過還沒關於Swift的任何buildpacks,令人驚歎的開源社群又一次提供瞭解決辦法,我看到Kyle Fuller’s buildpack這個,整合它比較簡單。
 用 Swift 寫伺服器端
當你把這個buildpack安裝之後,app成功載入了,是時候訪問真實世界的網址了。

更多失敗

用 Swift 寫伺服器端
事情沒有那麼容易,是吧。我谷歌了一下並且認真看了看一些例子,我發現我需要一個 Profile。看到檔案內容就能明白這個檔案的目的是什麼了。
用 Swift 寫伺服器端
這個buildpack建立了可執行檔案,但是Heroku並不知道它。我們要在Profile中告訴Heroku執行SwiftServerIO這個可執行檔案。上傳這個Profile檔案。

更多失敗第二部分

Heroku編譯的兩分鐘非常漫長,我迅速的重新整理瀏覽器卻只看到了這個:

用 Swift 寫伺服器端

我想或許是因為Heroku需要一些時間來啟動(其實不是),我等了一會發現還是有問題。生成了可執行檔案,process檔案準備好了,肯定還有一些東西有問題。又google了一下我最終發現需要設定這個應用的scale。在Heroku toolbelt中執行一個簡單的命令。
heroku ps:scale web=1

用 Swift 寫伺服器端
Heroku 只提供一個免費的dyno(譯者注:類似於雲伺服器中的例項,Heroku給出的定義是一個能夠執行使用者指定命令的Linux容器),這對於我們簡單的伺服器夠用了。進行了如上操作之後,這個dyno正常的執行起來了,這時我們再去檢查一下瀏覽器。

成功了

用 Swift 寫伺服器端
好了,伺服器執行起來了,帶著常見的hello world提示。自我慶祝了半天之後,是時候來問候一下了。

響應

在我們的main.swift檔案中增加一些程式碼來讓伺服器更人性化的打招呼,增加另一個get路由點,稍微偷下懶,讓伺服器將輸入直接返回作為迴應。
用 Swift 寫伺服器端

一切應當順利,但是鑑於一般的開發情況,我已做好遇到另一個路由錯誤的準備。提交變更,推送程式碼到Heroku。

說Hello

用 Swift 寫伺服器端
花一些時間進行配置後,(將檔案)加入到我的hello伺服器就像推送到Heroku那樣簡單。過了一分鐘左右的編譯時間,這個連結變成了啟用狀態,伺服器返回了Hello。你可以點選檢視效果

接下來呢
我現在看到的所有跡象,有力的證明了, 服務端的Swift有了社群的支援,會變得更加強大。對於我來說,從遠端獲得真正的JSON是令人興奮的第一步,我迫不及待的想要看接下來的內容了。
在那之前,我會和同事在 Intrepid Pursuits接著寫iOS應用,如果你想要知道我的動態,可以關注我的我的Github或者Twitter中的任意一個。

服務端Swift!

PS

你可以在這裡下載排版精美的原始碼。

在這個Journal 資料夾裡包含了逐步介紹。

相關文章