你好揭鳞,服務(wù)端的Swift
自從蘋(píng)果公司正式發(fā)布了一個(gè)適用于linux的開(kāi)源版本后炕贵,服務(wù)端的Swift擁有了令人興奮的前景。我的好奇心終于戰(zhàn)勝了我野崇,是時(shí)候嘗試一下服務(wù)端的Swift了称开。
除了很少的BaaS經(jīng)驗(yàn),我沒(méi)有其他后端經(jīng)驗(yàn)乓梨,不過(guò)慶幸的是開(kāi)源社區(qū)已經(jīng)花了很大精力在編寫(xiě)框架鳖轰。我花了一些時(shí)間試了這些框架,最后決定使用Tanner Nelson的Vapor扶镀。它安裝簡(jiǎn)單蕴侣,很適合我的任務(wù),而且在文檔中它顯示了支持Heroku(譯者注:Heroku是一個(gè)支持多種編程語(yǔ)言的云平臺(tái)即服務(wù))狈惫。我選擇Heroku是因?yàn)樗俏覀兒蠖苏谑褂盟χ耄鼘?duì)于前端來(lái)說(shuō)很友好鹦马。
*至寫(xiě)這篇文章為止胧谈,為了能夠在Heroku上正常運(yùn)行,我(對(duì)vapor)做了一些更改并且發(fā)起了一個(gè)pull request荸频。如果代碼沒(méi)有被合并菱肖,你可以使用包管理器在這里下載。
安裝
開(kāi)始之前旭从,你需要一個(gè)Heroku賬戶并且安裝Swift Development Snapshot稳强。寫(xiě)這篇文章的時(shí)候场仲,Swift正式版安裝包并沒(méi)有包含Swift包管理軟件,為了使用這個(gè)工具(Swift包管理軟件)退疫,你需要下載開(kāi)發(fā)版的安裝包渠缕。
開(kāi)始
我們的目標(biāo)是啟動(dòng)一個(gè)在Heroku上運(yùn)行的簡(jiǎn)單Swift服務(wù)器,并且這個(gè)服務(wù)器能返回hello褒繁。 不需要運(yùn)行在linux環(huán)境中亦鳞,它就像使用本地服務(wù)器。這意味著(只需要)建立一個(gè)本地Xcode工程并且配置它棒坏,再在swift package manager中運(yùn)行它燕差。包含4個(gè)主要步驟:
將main.swift文件移動(dòng)到Sources文件夾的頂層
增加 Package.swift文件
增加 .build目錄到import paths
要使我們導(dǎo)入的框架獲得自動(dòng)補(bǔ)全和語(yǔ)法高亮,swift package manager的編譯目錄需要添加到import paths?坝冕。確認(rèn)在debug設(shè)置中導(dǎo)入了debug文件夾徒探,release設(shè)置則導(dǎo)入release文件夾。
使用toolchain 運(yùn)行 Xcode
如果你使用 Xcode 7.3喂窟,你可以用 Xcode > Toolchains 菜單開(kāi)啟一個(gè)Xcode 實(shí)例测暗,來(lái)使用 swift
snapshot。?需要注意的是即使做了以上的操作谎替,我們還是不能在Xcode里面編譯偷溺,需要使用swift
build命令在命令行(終端)中編譯。
創(chuàng)建服務(wù)器
僅僅需要寫(xiě)很少的代碼就可以啟動(dòng)和運(yùn)行來(lái)驗(yàn)證某個(gè)想法钱贯,這讓我很驚喜挫掏。用來(lái)小于10行的代碼,我把服務(wù)器啟動(dòng)并運(yùn)行了秩命。
這里使用命令行在終端啟動(dòng)并運(yùn)行服務(wù)尉共。
目前為止看起來(lái)不錯(cuò),讓我們?cè)跒g覽器中檢查一下弃锐。你屏幕上的顯示看起來(lái)可能和我的不同袄友,因?yàn)槲沂褂昧?a target="_blank" rel="nofollow">json formatter plugin這個(gè)插件(譯者注:一款chrome插件,能夠讓json數(shù)據(jù)格式化顯示)霹菊。
部署到云服務(wù)器
本地配置服務(wù)器看起來(lái)比較順利剧蚣,但是如果能遠(yuǎn)程部署就更酷啦。我迫切的希望把這個(gè)app部署在那個(gè)(Heroku)云服務(wù)上面旋廷。這對(duì)我來(lái)說(shuō)是未知領(lǐng)域鸠按,幸運(yùn)的是我從Vincent Toms那里找了一些極好的指南幫助我解決了很多問(wèn)題。
Heroku部署令人有愉快的體驗(yàn)饶碘,幾分鐘之內(nèi)我就把我的app部署上了目尖,我的toolbelt安裝上了,我已經(jīng)準(zhǔn)備好提交我的項(xiàng)目了扎运。
失敗
這是今天諸多失敗之一瑟曲。我意料到事情不會(huì)如此的順利饮戳,我去查看vapor的文檔,最后目光停留在那些名為 buildpacks的新奇東西上洞拨。Heroku提供了一些標(biāo)準(zhǔn)的現(xiàn)成的buildpacks扯罐,不過(guò)還沒(méi)關(guān)于Swift的任何buildpacks,令人驚嘆的開(kāi)源社區(qū)又一次提供了解決辦法烦衣,我看到Kyle Fuller’s buildpack這個(gè)篮赢,集成它比較簡(jiǎn)單。
當(dāng)你把這個(gè)buildpack安裝之后琉挖,app成功加載了启泣,是時(shí)候訪問(wèn)真實(shí)世界的網(wǎng)址了。
更多失敗
事情沒(méi)有那么容易示辈,是吧寥茫。我谷歌了一下并且認(rèn)真看了看一些例子,我發(fā)現(xiàn)我需要一個(gè) Profile矾麻∩闯埽看到文件內(nèi)容就能明白這個(gè)文件的目的是什么了。
這個(gè)buildpack建立了可執(zhí)行文件弄喘,但是Heroku并不知道它。我們要在Profile中告訴Heroku運(yùn)行SwiftServerIO這個(gè)可執(zhí)行文件甩牺。上傳這個(gè)Profile文件蘑志。
更多失敗第二部分
Heroku編譯的兩分鐘非常漫長(zhǎng),我迅速的刷新瀏覽器卻只看到了這個(gè):
我想或許是因?yàn)镠eroku需要一些時(shí)間來(lái)啟動(dòng)(其實(shí)不是)贬派,我等了一會(huì)發(fā)現(xiàn)還是有問(wèn)題急但。生成了可執(zhí)行文件,process文件準(zhǔn)備好了搞乏,肯定還有一些東西有問(wèn)題波桩。又google了一下我最終發(fā)現(xiàn)需要設(shè)置這個(gè)應(yīng)用的scale。在Heroku
toolbelt中運(yùn)行一個(gè)簡(jiǎn)單的命令请敦。
heroku ps:scale web=1
Heroku 只提供一個(gè)免費(fèi)的dyno(譯者注:類(lèi)似于云服務(wù)器中的實(shí)例镐躲,Heroku給出的定義是一個(gè)能夠運(yùn)行用戶指定命令的Linux容器),這對(duì)于我們簡(jiǎn)單的服務(wù)器夠用了侍筛。進(jìn)行了如上操作之后萤皂,這個(gè)dyno正常的運(yùn)行起來(lái)了,這時(shí)我們?cè)偃z查一下瀏覽器勾笆。
成功了
好了敌蚜,服務(wù)器運(yùn)行起來(lái)了桥滨,帶著常見(jiàn)的hello world提示窝爪。自我慶祝了半天之后弛车,是時(shí)候來(lái)問(wèn)候一下了。
響應(yīng)
在我們的main.swift文件中增加一些代碼來(lái)讓服務(wù)器更人性化的打招呼蒲每,增加另一個(gè)get路由點(diǎn)纷跛,稍微偷下懶拌屏,讓服務(wù)器將輸入直接返回作為回應(yīng)专筷。
一切應(yīng)當(dāng)順利忍坷,但是鑒于一般的開(kāi)發(fā)情況彻秆,我已做好遇到另一個(gè)路由錯(cuò)誤的準(zhǔn)備屹耐。提交變更燃领,推送代碼到Heroku颗味。
說(shuō)Hello
花一些時(shí)間進(jìn)行配置后舔亭,(將文件)加入到我的hello服務(wù)器就像推送到Heroku那樣簡(jiǎn)單脖律。過(guò)了一分鐘左右的編譯時(shí)間谢肾,這個(gè)鏈接變成了激活狀態(tài),服務(wù)器返回了Hello小泉。你可以點(diǎn)擊查看效果芦疏。
接下來(lái)呢
我現(xiàn)在看到的所有跡象,有力的證明了,?服務(wù)端的Swift有了社區(qū)的支持微姊,會(huì)變得更加強(qiáng)大酸茴。對(duì)于我來(lái)說(shuō),從遠(yuǎn)程獲得真正的JSON是令人興奮的第一步兢交,我迫不及待的想要看接下來(lái)的內(nèi)容了薪捍。
在那之前,我會(huì)和同事在Intrepid Pursuits接著寫(xiě)iOS應(yīng)用配喳,如果你想要知道我的動(dòng)態(tài)飘诗,可以關(guān)注我的我的Github或者Twitter中的任意一個(gè)。