You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift Vapor服务器在Fly.io构建Docker时出现错误

问题原因分析

你的错误核心是**Date.formatted() API以及相关的格式化枚举(.numeric、.abbreviated等)在Fly.io的构建环境中不被支持**,本地HostMyApple服务器能正常运行的原因是:

  • 本地Mac服务器使用的Swift版本较高(Swift 5.5+,对应macOS 12+),这些API是Swift 5.5结合Foundation框架新增的;但Fly.io默认构建环境的Swift版本或目标系统版本较低,不支持该API。
  • 项目的Package.swift中可能未明确指定最低支持的Swift版本或系统版本,导致Fly.io构建时采用了更低的兼容版本。
解决办法

有两种方案可选,按需使用:

方案1:强制Fly.io使用兼容的Swift/系统版本

在项目根目录执行以下操作:

  1. 创建或修改.swift-version文件,写入你本地使用的Swift版本号(比如5.8),确保Fly.io构建时调用对应版本的Swift工具链。
  2. 修改Package.swift中的platforms配置,明确指定最低支持的系统版本,示例:
let package = Package(
    name: "YourAppName",
    platforms: [
        .macOS(.v12), // Date.formatted需要macOS 12及以上版本支持
        // 若有其他平台需求可添加,比如.iOS(.v15)
    ],
    dependencies: [
        // 你的项目依赖项
    ],
    targets: [
        // 你的target配置
    ]
)

修改完成后重新执行fly launch或fly deploy即可。

方案2:替换为兼容旧版本的Date格式化代码

如果不想依赖高版本Swift/系统,可以用传统的DateFormatter替代Date.formatted(),兼容性更强。示例如下:

替换第一处出错代码

原代码:

return (newDate?.formatted(date: .numeric, time: .omitted))!

替换为:

guard let newDate = newDate else {
    // 建议替换为合理的默认值,避免强制解包崩溃
    return ""
}
let formatter = DateFormatter()
formatter.dateStyle = .numeric
formatter.timeStyle = .none
return formatter.string(from: newDate)

替换第二处出错代码

原代码:

return (rentDate.formatted(date: .abbreviated, time: .omitted))

替换为:

let formatter = DateFormatter()
formatter.dateStyle = .medium // .abbreviated对应medium风格,可根据显示需求调整
formatter.timeStyle = .none
return formatter.string(from: rentDate)

内容的提问来源于stack exchange,提问作者AFinch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:03:12