簡體   English   中英

僅當從 Xcode 運行時,Swift package 調用 /usr/bin/swift 錯誤並出現“無法打開 macho 文件...太多級別的符號鏈接”

[英]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
}

這需要更多的測試來了解在環境中傳遞的PWDProcess.currentDirectoryURL之間的關系,但這至少可以讓球滾動起來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM