场景
通过 vapor xcode
生成项目文件后。通过 Xcode 运行默认地址是:
Server starting on http://localhost:8080
但是你的 8080 端口可能被其它服务占用,也可能你需要同时运行多个 Vapor 应用。下面是你将会得到的错误信息:
Thread 1: Fatal error: Error raised at top level: bind(descriptor:ptr:bytes:) failed: Address already in use (errno: 48)
解决办法
下面两种方法选其一即可
配置 Scheme
在 Xcode 里面,进入 Edit Scheme...
:
选择 Arguments
选项卡。在 Arguments Passed On Launch
块添加如下行:
--hostname 127.0.0.1 --port 8069
根据实际情况,填写你的 hostname
和 port
参数值。
代码设置参数
在 Sources
-> Run
-> main.swift
文件中,修改代码如下:
var arguments = CommandLine.arguments
arguments.append(contentsOf: ["--hostname","127.0.0.1","--port","8069"])
try app(.detect(arguments: arguments)).run()
2018.08.08更新其实不太建议修改 Run
-> main.swift
文件。因为 Run
只 import
了 App
模块,而上面代码其实是修改 Vapor
模块的 Environment
结构体。
所以更新代码为 App
-> app.swift
:
var arguments = CommandLine.arguments
arguments.append(contentsOf: ["--hostname","127.0.0.1","--port","8066"])
let commandInput = CommandInput(arguments: arguments)
env.commandInput = commandInput
2018.08.21更新
其实,again,在阅读更多源码后,了解到了更多的细节。建议修改 NIOServerConfig
。原因是修改 Service 更符合 Vapor 项目架构,NIOServerConfig
包含所有 Server 启动需要的默认值,并且可以以参数的形式传递值,更加安全方便。而 env.commandInput
是基于 CommandLine.arguments
的,如果在命令行里面运行服务的时候加入了 --hostname --port 参数,则会与 env.commandInput
冲突并报错:
Fatal error: Error raised at top level: ⚠️ CommandError: Too many arguments or unsupported options were supplied: ["--hostname", "127.0.0.1", "--port", "8099"]
而 CommandLine.arguments
并不会与 NIOServerConfig
冲突,只会优先使用前者:
//NIOServer.swift, func start
let hostname = hostname ?? config.hostname
let port = port ?? config.port
所以建议在 configure.swift 中添加如下代码:
var nioServerConfig = NIOServerConfig.default()
nioServerConfig.hostname = "127.0.0.1"
nioServerConfig.port = 8067
services.register(nioServerConfig)
总结
上面两种办法,其实都是通过 vapor 的命令参数来设置的:
.build/debug/Run --hostname 127.0.0.1 --port 8069
第一种方式无需改动代码,在部署 Vapor 到服务器的时候更加灵活。
第二种方式虽然利用代码设置的参数,但是相信在以后涉及到更多复杂的应用场景的时候,也会有其可用的地方。
后台运行
部署
在部署到 Linux 服务器后,可以使用下面的方式进行后台运行,防止终端退出会造成服务停止:
nohup .build/debug/Run --hostname 127.0.0.1 --port 8069 &
如果在 main.swift
已经配置了 hostname
和 port
:
nohup vapor run serve &
如果直接使用 vapor run
指定 hostname
和 port
参数会报错!不知为何。知道的麻烦给我留言。
Use `.build/debug/Run <command> [--help,-h]` for more information on a command.
Fatal error: Error raised at top level: ⚠️ CommandError: Unknown command `127.0.0.1`
- id: CommandError.unknownCommand
: file /home/buildnode/jenkins/workspace/oss-swift-4.1-package-linux-ubuntu-16_04/swift/stdlib/public/core/ErrorType.swift, line 191
运行
查看运行的 vapor 进程:
ps -aux | grep Run
- a:显示所有程序;
- u:以用户为主的格式来显示;
- x:显示所有程序,不以终端机来区分
截图中的第一条结果可以忽略,它表示当前正在执行的命令。第二条结果的 27097
则为需要的 <PID>
停止
停止运行:
kill -9 <PID>
结语
话不多说了。
目前 Vapor 的资料还是比较少的。希望你读到这篇文章对你有所帮助,在 Vapor 的路上找到乐趣😁。
后续会把最近在写的 Vapor 项目整理成文章,从代码的角度来解析我的一些用法。
本文由 Bill 创作。
最后编辑时间为: 2019.01.21 at 11:00 am