我试图在我的Swift 3.0.2中调用String(contentsOfFile:encoding:)
(也发生在3.0.1上)Heroku上的服务器应用程序(在Ubuntu上运行它),但该函数中止该程序。 heroku logs
中显示以下错误:
2016-12-26T01:59:01.304535+00:00 heroku[web.1]: Process exited with status 139
除此之外没有任何错误消息。我尝试阅读的文件与应用程序的源文件位于同一目录树中。这是实际代码的功能等效收缩(位于main.swift
的顶层):
let sqlDirectory = URL(fileURLWithPath: #file).deletingLastPathComponent().path + "/Models/SQL/"
do {
print("reading")
fflush(stdout)
let a = try String(contentsOfFile: sqlDirectory + "createTables.sql", encoding: .utf8)
print("done")
fflush(stdout)
} catch {
print("error")
fflush(stdout)
}
sqlDirectory
的运行时值为/tmp/build_514c5587b46ef976e60d4f039b4d048d/Sources/App/Models/SQL/
(每个构建中的哈希值不同)。打印reading
后崩溃。永远不会打印done
或error
。 (stdout刷新仅用于调试以确保所有内容都写入stdout。删除它们不会影响崩溃。)
这是关于什么以及我该如何解决?
我还将此报告为错误here,因为它似乎可能是一个错误。
答案 0 :(得分:0)
我查看了FileManager.default.fileExists(atPath: sqlDirectory + "createTables.sql")
及false
的结果。
这就解释了为什么String(contentsOfFile:encoding:)
崩溃了。虽然它应该抛出错误而不是崩溃。以下是基本错误:https://bugs.swift.org/browse/SR-1547,这似乎是由此错误引起的:https://bugs.swift.org/browse/SR-585。
我仍然需要找出Heroku上没有路径的原因。也许Heroku在构建后移动或删除所有源文件?