dea*_*.dg 2 xcode swift swiftpm
我正在 Swift 中开发一个命令行应用程序,它将调用来swift初始化包、编译东西、测试东西等。我正在使用 swift 包管理器和 Xcode。在我的工具中,我swift从Process. 如果我从命令行运行我的工具,那么效果很好。但是,如果我从 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
Run Code Online (Sandbox Code Playgroud)
是什么原因造成的?有什么方法可以避免它,或者我可以不从 Xcode 运行/测试这个实用程序吗?
以下是重现步骤:
mkdir XcodeRedirectionTest
cd XcodeRedirectionTest
swift package init
open Package.swift
Run Code Online (Sandbox Code Playgroud)
然后在 中Tests/XcodeRedirectionTestTests/XcodeRedirectionTestTests.swift,粘贴
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
Run Code Online (Sandbox Code Playgroud)
在 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 ("")
Run Code Online (Sandbox Code Playgroud)
也就是说(所以你不必滚动(尽可能多)),标准错误最终是
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
Run Code Online (Sandbox Code Playgroud)
但是,swift test从命令行运行会成功。没有标准错误!
如果重要的话,我正在 macOS Big Sur 11.2.3 上运行 Xcode 12.5。
我能够将范围缩小到环境变量OS_ACTIVITY_DT_MODE。似乎 Xcode1在运行程序时将其设置为。如果未设置此变量,则不会显示错误。我用来完成此操作的代码是
if ProcessInfo.processInfo.environment.keys.contains("OS_ACTIVITY_DT_MODE") {
var env = ProcessInfo.processInfo.environment
env["OS_ACTIVITY_DT_MODE"] = nil
process.environment = env
}
Run Code Online (Sandbox Code Playgroud)
PWD这需要更多的测试来了解环境中传递的内容 和之间的关系Process.currentDirectoryURL,但这至少能让事情顺利进行。