Perfect简介

{% github PerfectlySoft Perfect 60e44e4 width = 30% %} 目前比较流行服务端框架主要有VaporPerfectKituraZewo,他们各有长短,本人这次主要是使用Perfect来写的,因为Perfect的功能比较完善,在GitHub上具有1W+的星,而且有一个非常重要的原因提供了Perfect 中文文档

Perfect 包括了您所期待的所有基本功能,包括路由websockets 基于 HTTP 的网络套接字、TLS(SSL)通信加密、Mustache 模板和 Markdown 模板、JSON 结构化数据等等,以及全部其他所有 Swift 后台框架加在一起才有的 XML 结构化数据、苹果推送消息 APNSMqTT 消息队列和 SMTP 邮件发送,甚至大数据也支持。Perfect 的数据库支持非常广泛,其原生SQL驱动包括 MySQLSQLitePostgreSQLMariaDB,还支持 MongoDBRedisCouchDB 甚至还包括 FileMaker(苹果自己的数据库 Swift 都不支持,Perfect 反过来支持——译者注)。Perfect 据说还部分支持微软的 ODBC,即多种数据库的底层兼容界面——有点像 ORM,但是以 C 函数库为基础。提到 ORM 数据库对象关系自动化管理,PerfectStORM 并完整实现了 PostgreSQLMySQLCouchDBSQLite

Perfect文档生成器

搭建HTTP服务器

{% github it-boyer PerfectTemplate 20294e56 width = 30% %} 本章将引导您使用Swift和Perfect软件框架逐步设置一个简单的HTTP服务器。

创建Web应用

原文

  1. 新建一个文件夹保存项目文件:
1
2
$ mkdir iPerfect
$ cd iPerfect
  1. 初始化项目,用SPM软件包管理器:
1
2
3
4
5
6
7
8
$ swift package init --type=executable
Creating executable package: iPerfect
Creating Package.swift
Creating README.md
Creating .gitignore
Creating Sources/
Creating Sources/iPerfect/main.swift
Creating Tests/
  1. 配置依赖 打开Package.swift文件进行编辑: 该文件在要求Swift编译的最低版本为3.0.0,设置target编译依存库PerfectHTTPServer
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
// swift-tools-version:4.0
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
name: "iPerfect",
    dependencies: [
        .package(url: "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", from: "3.0.0")
    ],
    targets: [
    .target(
        name: "iPerfect",
        dependencies: ["PerfectHTTPServer"]),
    ]
)
  1. 编码
1
2
mkdir Sources
echo 'print("您好!")' >> Sources/iPerfect/main.swift
  1. 编译和运行 现在项目就已经准备好,可以通过以下两个命令编译和运行:
1
2
swift build
.build/debug/iPerfect

成功之后,会打印:

1
你好!!!

设置Perfect HTTPServer服务器

注册路由和请求/响应句柄

打开Sources/iPerfect/main.swift文件,把内容替换为以下程序:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import PerfectHTTP
import PerfectHTTPServer

// 注册路由和请求/响应句柄
var routes = Routes()
routes.add(method: .get, uri: "/") {
    request, response in
    response.setHeader(.contentType, value: "text/html")
    response.appendBody(string: "<html><title>Hello, world!</title><body>Hello, world!</body></html>")
    .completed()
}

do {
    // 启动HTTP服务器
    try HTTPServer.launch(.server(name: "www.example.ca", port: 8181, routes: routes))
} catch {
    fatalError("\(error)") // fatal error launching one of the servers
}
  1. 编译运行
1
2
3
4
$ swift build
$ .build/debug/iPerfect
>>
[INFO] Starting HTTP server www.example.ca on :::8181

在浏览器上打开http://127.0.0.1:8181/ 终止服务器:在终端控制台上用组合键control-c可以随时停止服务器。

使用Xcode调试服务器

生成iPerfect.xcodeproj Swift软件包管理器(SPM)能够为您的项目iPerfect生成Xcode工程:

1
swift package generate-xcodeproj

递归编译设置

  1. 设置递归编译项目目录中的所有target 打开iPerfect.xcodeproj,在检索项目软件库Library Search Paths字典中新增路径:$(PROJECT_DIR) ,路径属性修改为recursiverecursive:遍历该目录,non-recursive:默认路径设置;不遍历该目录。 如果路径的属性为recursive,那么编译的时候在找库的路径的时候,会遍历该目录下的所有子目录的库文件。

PS:在搭建项目的时候,可以创建一个专门放库文件的文件夹并且设置其属性为recursive:即为$(PROJECT_DIR)/**,相当于遍历项目文件同级下的所有路径(不推荐使用,项目大的话,影响编译的速度)。

  1. scheme运行在My Mac 在Xcode打开项目之后,选择可执行目标为 My Mac,并选择正确的Swift工具链。
  2. 设置服务器的资源目录 为了使服务器能够访问您工程文件夹下的目录,比如html静态网页。 进入菜单命令 Product > Scheme > Edit Scheme…,设置工作目录 Use Custom Working Directory 为项目文件夹。

现在您就可以在Xcode中运行调试您的服务器了.