gpt4 book ai didi

仅当从 Xcode 运行时,Swift 包调用/usr/bin/swift 时出现 `Failed to open macho file...Too many levels of symbolic links` 错误

转载 作者:行者123 更新时间:2023-12-02 18:44:44 26 4
gpt4 key购买 nike

我正在 Swift 中开发一个命令行应用程序,它将调用 swift 来初始化包、编译、测试等。我正在使用 swift 包管理器和 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
}

这需要更多测试来了解环境中传递的 PWDProcess.currentDirectoryURL 之间的关系,但这至少能让事情顺利进行。

关于仅当从 Xcode 运行时,Swift 包调用/usr/bin/swift 时出现 `Failed to open macho file...Too many levels of symbolic links` 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67595371/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com