作者:Logan Wright
譯者:CocoaChina--kmyhy(博客)
自從蘋果官方發(fā)布了一個(gè) Swift 的 Linux 開源版本之后,服務(wù)端 Swift 終于迎來了一個(gè)令人激動(dòng)的前景。我的好奇心終于無法克制,是時(shí)候嘗試一下服務(wù)端 Swift 了!
除了用過幾個(gè) Baas 以外,我沒有任何后端編程經(jīng)驗(yàn),但幸運(yùn)的是開源社區(qū)已經(jīng)提供了現(xiàn)成的框架。我試了一下Tanner Nelson 推薦的 Vapor 框架。它的使用非常簡單,非常適合我當(dāng)前的任務(wù),在這篇文檔中還會(huì)使用到 Heroku。我決定使用 Heroku 的原因是我們的后端團(tuán)隊(duì)在使用它,它對(duì)于前端來說非常友好。
寫到這里的時(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è)簡單的 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)行它。整過過程分為 4 個(gè)步驟:
將 main.swift 拷貝根目錄下的 Sources 目錄
創(chuàng)建一個(gè) Package.swift 文件
將 .build 目錄添加到 import paths
要使用自動(dòng)補(bǔ)全和語法加亮功能,需要將 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)行起來了,但如果放到云端則更好。我迫不及待地想將 App 在云上跑起來。對(duì)于我來說這是一個(gè)全新的挑戰(zhàn),幸運(yùn)的是,我得到了 Vincent Toms 的悉心指導(dǎo)。
Heroku 的安裝是一件非常愉悅的體驗(yàn),幾分鐘后我就創(chuàng)建了一個(gè) Heroku App,接下來我就要上傳我的項(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。無奈之下求救于開源社區(qū),剛好看到 Kyle Fuller 的 buildpack 。集成它就簡單得多了。
用這個(gè) buildpack 啟動(dòng)后,App 成功加載,接下來就是訪問它的 URL。
再次出錯(cuò)
事情不會(huì)那么順利的,是吧?經(jīng)過 google 一番,仔細(xì)查看了一些例子,我發(fā)現(xiàn)我還差一個(gè) Procfile。瀏覽一下這個(gè)文件的內(nèi)容,你就能明白這個(gè)文件是干什么用的了。
buildpack 創(chuàng)建了可執(zhí)行文件,但 Heroku 并不知道。通過 Procfile,我們告訴 Heroku 去運(yùn)行 SwiftServerIO 可執(zhí)行文件。上傳這個(gè) Procfile。
仍然出錯(cuò)
Heroku 編譯的 2 分支仿佛變得無比漫長。我重新打開了瀏覽器,發(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è)簡單命令。
heroku ps:scale web=1
Heroku 在免費(fèi)情況下只有一個(gè) dyno(Heroku 計(jì)費(fèi)單位,10~50 個(gè)請(qǐng)求/秒)。但對(duì)于我們的簡單服務(wù)器來說,這也夠了。因此,在我們將 scale web 設(shè)置為 1 個(gè) dyno 之后,再次用瀏覽器查看。
成功了!
成功了!服務(wù)器啟動(dòng),出現(xiàn)了萬能的 hello world!經(jīng)過一番歡呼雀躍之后,讓我們真正來問一聲好吧!
響應(yīng)請(qǐng)求
在 main.swfit 文件中添加一小段代碼,讓服務(wù)器在問好的同時(shí)能夠因人而異。就微微偷一下懶,新加一個(gè)路由,讓服務(wù)器根據(jù)輸入輸出不同的問候語。
一切正常,但根據(jù)一般規(guī)律,我仍然做好了出錯(cuò)的心理準(zhǔn)備。提交修改,push 代碼到 Heroku。
Say Hello!
大約一份多鐘的編譯之后,在瀏覽器中訪問 URL,服務(wù)器返回了問候語。你可以在這里查看效果 。
接下來是什么?
可以說,服務(wù)端 Swift 的今天離不開社區(qū)強(qiáng)大支持。對(duì)于我來說,能夠從云端獲取 JSON 是一個(gè)令人興奮的開始,我已經(jīng)迫不及待地想看看接下來還會(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 指南。