![](/img/trans.png)
[英]Using Swift 3 in Xcode 10.2 - Command /Library/Developer/Toolchains/swift-3.0-RELEASE.xctoolchain/usr/bin/swiftc failed with exit code 1
[英]Swift package calling /usr/bin/swift errors with `Failed to open macho file...Too many levels of symbolic links` only when running from Xcode
I am developing a command line app in Swift which will call out to swift
in order to initialize packages, compile things, test things, etc. I am using the swift package manager and Xcode. 在我的工具中,我从Process
调用swift
。 如果我从命令行运行我的工具,这工作正常。 但是,如果我从 Xcode 运行我的工具,则会将一些奇怪的东西打印到标准错误中。 特别是,我得到
Failed to open macho file at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift for reading: Too many levels of symbolic links
这是什么原因造成的? 有什么方法可以避免它,或者我可以不从 Xcode 运行/测试这个实用程序吗?
以下是复制步骤:
mkdir XcodeRedirectionTest
cd XcodeRedirectionTest
swift package init
open Package.swift
然后在Tests/XcodeRedirectionTestTests/XcodeRedirectionTestTests.swift
中,粘贴
import XCTest
final class XcodeRedirectionTestTests: XCTestCase {
func testExample() {
let process = Process()
process.launchPath = "/usr/bin/swift"
process.arguments = ["--version"]
let standardOutput = Pipe()
let standardError = Pipe()
process.standardOutput = standardOutput
process.standardError = standardError
process.launch()
process.waitUntilExit()
guard let output = String(data: standardOutput.fileHandleForReading.readDataToEndOfFile(), encoding: .utf8) else { XCTFail(); return }
guard let error = String(data: standardError.fileHandleForReading.readDataToEndOfFile(), encoding: .utf8) else { XCTFail(); return }
XCTAssertEqual(process.terminationReason, .exit)
XCTAssertEqual(process.terminationStatus, 0)
XCTAssertEqual(error, "")
XCTAssert(output.starts(with: "Apple Swift version 5.4"))
}
}
Xcode 中的测试失败
file://.../XcodeRedirectionTest/Tests/XcodeRedirectionTestTests/XcodeRedirectionTestTests.swift: test failure: XcodeRedirectionTestTests.testExample() failed: XCTAssertEqual failed: ("2021-05-18 19:43:18.084463-0400 swift[2836:4100702] Failed to open macho file at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift for reading: Too many levels of symbolic links
") is not equal to ("")
也就是说(所以你不必滚动(尽可能多)),标准错误最终是
Failed to open macho file at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift for reading: Too many levels of symbolic links
但是,从命令行运行swift test
成功。 没有标准错误!
如果重要的话,我在 macOS Big Sur 11.2.3 上运行 Xcode 12.5。
我能够将其缩小到环境变量OS_ACTIVITY_DT_MODE
。 似乎 Xcode 在运行程序时将其设置为1
。 如果未设置此变量,则不会显示错误。 我用来完成此操作的代码是
if ProcessInfo.processInfo.environment.keys.contains("OS_ACTIVITY_DT_MODE") {
var env = ProcessInfo.processInfo.environment
env["OS_ACTIVITY_DT_MODE"] = nil
process.environment = env
}
这需要更多的测试来了解在环境中传递的PWD
和Process.currentDirectoryURL
之间的关系,但这至少可以让球滚动起来。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.