自從蘋果官方發布了一個 Swift 的 Linux 開源版本之後,服務端 Swift 終於迎來了一個令人激動的前景。我的好奇心終於無法克制,是時候嘗試一下服務端 Swift 了!
除了用過幾個 Baas 以外,我沒有任何後端編程經驗,但幸運的是開源社區已經提供了現成的框架。我試了一下 Tanner Nelson 推薦的 Vapor 框架。它的使用非常簡單,非常適合我當前的任務,在這篇文檔中還會使用到 Heroku。我決定使用 Heroku 的原因是我們的後端團隊在使用它,它對於前端來說非常友好。
寫到這裡的時候,為了解決 Heroku 框架運行中的幾個小問題,我專門提交了一個 pull request。如果代碼還沒被合並的話,請設置你的包管理器從這裡下載。
要繼續本教程,首先,你需要一個 Heroku 賬號,並安裝好 Swift Development Snapshot。寫到這裡的時候,在它的正式版中還未包含 swift 包管理器。因此為了使用這個工具,你必須下載開發版的 snapshot。
我們的目標是創建一個簡單的 Swift 服務器並運行在 Heroku 上。這不需要在 linux 環境下進行,就像是你在使用本地服務器。你只消創建一個本地的 Xcode 項目,對項目進行一些設置,然後就可以在 Swift 包管理器中運行它。整過過程分為 4 個步驟:
要使用自動補全和語法加亮功能,需要將 Swift 包管理器的 build 目錄提交到 import paths 中。注意,在 import paths 的 Debug 中設置的 debug 目錄,而 Release 項則輸入 release 目錄。
如果你使用 Xcode 7.3,你可以用 Xcode > Toolchains 菜單開啟一個Xcode 實例,用於打開 swift snapshot。因為我們不能在 Xcode 中進行編譯,我們只能以命令行的方式進行編譯。
令我高興的是,為了進行概念驗證,我需要編寫的代碼其實只有寥寥數行。我啟動和運行服務器的代碼甚至不到 10 行。
要啟動服務器,只需在終端中輸入一句命令,:
好了,讓我們打開浏覽器。我的浏覽器安裝了 json 插件,你的畫面或許會有不同。
服務器在本地順利運行起來了,但如果放到雲端則更好。我迫不及待地想將 App 在雲上跑起來。對於我來說這是一個全新的挑戰,幸運的是,我得到了 Vincent Toms 的悉心指導。
Heroku 的安裝是一件非常愉悅的體驗,幾分鐘後我就創建了一個 Heroku App,接下來我就要上傳我的項目了。
這只是今天的諸多錯誤中的一個。我已經預計到事情不可能一帆風順,因此我查看了 Vapor 的文檔,最終發現問題出在所謂的 vcenter.heroku.com/articles/buildpacks">buildpacks 上。Heorku 提供了一些標准的 buildpacks,但完全沒有針對 Swift 的 buildpacks。無奈之下求救於開源社區,剛好看到 Kyle Fuller 的 buildpack。集成它就簡單得多了。
用這個 buildpack 啟動後,App 成功加載,接下來就是訪問它的 URL。
事情不會那麼順利的,是吧?經過 google 一番,仔細查看了一些例子,我發現我還差一個 Procfile。浏覽一下這個文件的內容,你就能明白這個文件是干什麼用的了。
buildpack 創建了可執行文件,但 Heroku 並不知道。通過 Procfile,我們告訴 Heroku 去運行 SwiftServerIO 可執行文件。上傳這個 Procfile。
Heroku 編譯的 2 分支仿佛變得無比漫長。我重新打開了浏覽器,發現仍然報錯。
我以為 Heroku 可能還未啟動完成(實際不是),因此我又等了一小會,終於發現出錯了。可執行文件生成了, process file 也就緒,一定是別的什麼地方出問題了。再次 google,一直到我最終發現我需要設置 App 的規模(scale up)。這要使用到 Heroku 的 toolbelt 中的一個簡單命令。
heroku ps:scale web=1
Heroku 在免費情況下只有一個 dyno(Heroku 計費單位,10~50 個請求/秒)。但對於我們的簡單服務器來說,這也夠了。因此,在我們將 scale web 設置為 1 個 dyno 之後,再次用浏覽器查看。
成功了!服務器啟動,出現了萬能的 hello world!經過一番歡呼雀躍之後,讓我們真正來問一聲好吧!
在 main.swfit 文件中添加一小段代碼,讓服務器在問好的同時能夠因人而異。就微微偷一下懶,新加一個路由,讓服務器根據輸入輸出不同的問候語。
一切正常,但根據一般規律,我仍然做好了出錯的心理准備。提交修改,push 代碼到 Heroku。
大約一份多鐘的編譯之後,在浏覽器中訪問 URL,服務器返回了問候語。你可以在這裡查看效果。
可以說,服務端 Swift 的今天離不開社區強大支持。對於我來說,能夠從雲端獲取 JSON 是一個令人興奮的開始,我已經迫不及待地想看看接下來還會發生什麼。
當然在此之前,我不得不和我在Intrepid Pursuits的同事們一起,繼續編寫一個有一個 iOS App。如果你想了解我的最新動態,請在訪問我的 Github 或者 Twitter。
服務端 Swift!
在這裡下載源代碼。
在 Journal 文件夾中,是 step-by-step 指南。