自从苹果官方发布了一个 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 个步骤:

####### 将 main.swift 拷贝根目录下的 Sources 目录

####### 创建一个 Package.swift 文件

####### 将 .build 目录添加到 import paths

要使用自动补全和语法加亮功能,需要将 Swift 包管理器的 build 目录提交到 import paths 中。注意,在 import paths 的 Debug 中设置的 debug 目录,而 Release 项则输入 release 目录。

####### 用 toolchain 运行 Xcode

如果你使用 Xcode 7.3,你可以用 Xcode > Toolchains 菜单开启一个 Xcode 实例,用于打开 swift snapshot。因为我们不能在 Xcode 中进行编译,我们只能以命令行的方式进行编译。

编写服务器

令我高兴的是,为了进行概念验证,我需要编写的代码其实只有寥寥数行。我启动和运行服务器的代码甚至不到 10 行。

要启动服务器,只需在终端中输入一句命令,:

好了,让我们打开浏览器。我的浏览器安装了 json 插件,你的画面或许会有不同。

迁移到云上

服务器在本地顺利运行起来了,但如果放到云端则更好。我迫不及待地想将 App 在云上跑起来。对于我来说这是一个全新的挑战,幸运的是,我得到了 Vincent Toms 的悉心指导。

Heroku 的安装是一件非常愉悦的体验,几分钟后我就创建了一个 Heroku App,接下来我就要上传我的项目了。

####### 出错啦

这只是今天的诸多错误中的一个。我已经预计到事情不可能一帆风顺,因此我查看了 Vapor 的文档,最终发现问题出在所谓的 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。

####### Say Hello!

大约一份多钟的编译之后,在浏览器中访问 URL,服务器返回了问候语。你可以在这里查看效果 。

接下来是什么?

可以说,服务端 Swift 的今天离不开社区强大支持。对于我来说,能够从云端获取 JSON 是一个令人兴奋的开始,我已经迫不及待地想看看接下来还会发生什么。

当然在此之前,我不得不和我在 Intrepid Pursuits 的同事们一起,继续编写一个有一个 iOS App。如果你想了解我的最新动态,请在访问我的 Github 或者 Twitter。

附言

在 这里 下载源代码。

在 Journal 文件夹中,是 step-by-step 指南。

swift 网页服务器上,使用 Swift 搭建服务器相关推荐

  1. swift系统中的服务器上,尝试Swift服务器框架 - Perfect

    为什么选择的是Perfect? 最近在关注Swift的服务器框架,其中主流框架前三分别是: Perfect star:8978 Vapor star:6919 Vapor是借鉴Laravel框架的,如 ...

  2. OpenStack-M版(Mitaka)搭建基于(Centos7.2)+++十、Openstack对象存储服务(swift)上

    十.Openstack对象存储服务(swift)上 配置:我在计算节点添加了两块硬盘(sdb,sdc)用来当存储用,在我这搭建中计算节点也就是存储节点了,原因电脑无法拉动更多虚拟几所以咯... 简单介 ...

  3. Linux平台swift语言开发学习环境搭建

    摘要  介绍在Ubuntu平台搭建Swift开发环境: 介绍Swift脚本解析器swift的使用: 介绍Swift编译器swiftc的使用: 1.序言 这两天一直忙,没来得及记录东西,周三12月4日凌 ...

  4. linux swift开发环境,Linux平台swift语言开发学习环境搭建

    摘要 介绍在Ubuntu平台搭建Swift开发环境: 介绍Swift脚本解析器swift的使用: 介绍Swift编译器swiftc的使用: 1.序言 这两天一直忙,没来得及记录东西,周三12月4日凌晨 ...

  5. 如何在Ubuntu 16.04上安装Swift和Vapor

    翻译自:How to Install Swift and Vapor on Ubuntu 16.04 介绍 Swift是Apple开发的一种编程语言,特点是快,安全和现代化,它有一个支持语言的庞大社区 ...

  6. 手把手教你在Windows上编译Swift工具链

    2020/5/27更新:大家现在可以直接从Saleem Abdulrasool的Azure Pipeline中下载打包好的Swift Windows SDK了,在他的GitHub中找到swift-bu ...

  7. swift linux编译器,Linux平台Swift语言开发学习环境搭建

    ####1.序言 这两天一直忙,没来得及记录东西,周三12月4日凌晨1点多看到苹果正式开源了Swift,国外各大媒体资讯动作超级快.我也兴奋的起来看了一遍关于Swift开源的最新消息.众所周知,苹果平 ...

  8. Swift 头像上传(2)http://blog.csdn.net/wei_chong_chong/article/details/52611110

    今天接着Swift头像上传(1)继续学习 实现效果:点击相册,打开相册 首先需要实现两个协议UIImagePickerControllerDelegate,UINavigationController ...

  9. 使用nat123在个人电脑上搭建服务器(小白详细教程)

    昨天自己在个人电脑上搭建了一个服务器(十分简陋...),也花了不少时间,遇到了一些坑.这里做一个分享,也帮大家避避坑.因为我也是个小白,自己摸索,所以我就尽量写得步骤详尽一点,让大家做起来顺利一些~ ...

最新文章

  1. 视频直播技术之iOS端推流
  2. (王道408考研数据结构)第七章查找-第一节:查找的基本概念、平均查找长度
  3. 小程序开发代码_企业为什么要选择小程序定制开发?
  4. for jq 嵌套_遍历嵌套列表 – jQuery
  5. anaconda+python3.7安装keras_win10 python3.7 Anaconda3 安装tensorflow+Keras
  6. Keil5配置GCC编译器编译STM32工程
  7. 瞎说一波3种基本背包问题【希望巨巨们指出错误】
  8. python中response对象的属性_关于python:AttributeError:’HTTPResponse’对象没有属性’split’...
  9. .NET程序员应掌握的常用类库
  10. BZOJ3343 洛谷2801:教主的魔法——题解
  11. axure文本框添加水印_Axure教程:限制输入框输入字数
  12. UML——实现图(构件图与部署图)
  13. Liunx 切换用户This account is currently not available
  14. “5杯水,怎么分给6个领导?” 答案暴露认知层次...
  15. 半导体的光学性质和光电与发光现象
  16. 问道服务器系统,《问道》全部服务器将正式更新至V1.351新版
  17. Connections could not be acquired from the unde...
  18. IDEA中使用Docker插件构建镜像并推送至私服Harbor
  19. IDEA软件常见的使用方法
  20. 七、数据结构:线性表-栈(后进先出)

热门文章

  1. 此生不戒多巴胺-冲刺计划
  2. 【OpenCV】数字图像的距离变换算法
  3. 青龙面板JDC企业微信设置消息推送教程
  4. 请大神帮我看看这是什么问题
  5. HDC2021技术分论坛:跨端分布式计算技术初探
  6. 别以为面试完就完事了!大厂HR告诉你这件事不做就亏大了!
  7. Android全屏背景布局,android-将彩色背景和边框半径添加到布局
  8. python:零矩阵
  9. 众包综述——关于众包的一些研究方向
  10. gdal(1)GF-1影像提取NDVI