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




































