Swift CLI - $PATH 不完整

Swift CLI - $PATH is incomplete

我正在构建一个 CLI 工具作为 Swift 包。部分流程需要我调用一些流程(比如gsutil)。当我尝试调用它们时,我总是以 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'launch path not accessible'

一些进一步的分析显示 pwdwhich 等常规命令工作正常。如下图所示,如果我尝试 echo $PATH,我会得到一个不完整的结果。

$PATH而运行项目直接

/Applications/Xcode-beta.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin\n

与我实际的 $PATH 变量完全不同:

echo $PATH
/Users/skwiggs/google-cloud-sdk/bin:/Users/skwiggs/.npm-global/bin:/Users/skwiggs/.rbenv/bin:/Users/skwiggs/.rbenv/shims:/Users/skwiggs/google-cloud-sdk/bin:/Users/skwiggs/.npm-global/bin:/Users/skwiggs/.rbenv/bin:/Users/skwiggs/.rbenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/share/dotnet:~/.dotnet/tools:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands

如何确保在调试 CLI 工具时正确设置环境变量?

如果您使用 Swift,您可以直接使用

访问您的环境变量
guard let path = ProcessInfo.processInfo.environment["PATH"] else {
    return
}
// ...

运行直接从 shell 使用该工具将传递给它预期的 $PATH 值,因此此问题仅在调试时发生。

如果你想用正确的 $PATH 值调试你的程序,你可以在活动方案中添加一个环境变量。该变量仅在调试时使用,因此覆盖它是安全的(当从 shell 调用您的产品时它将被忽略)。

  1. 打开一个终端
  2. 运行 echo $PATH
  3. 复制输出

然后,打开XCode

方案 -> 编辑方案 -> 运行 -> 环境变量 -> 添加。

名称 PATH <paste the value from terminal>

Build & 运行,您现在可以像从 shell.

调用项目一样进行调试

(请记住,您必须为每个需要此行为的新项目执行此操作,并且对您的 $PATH 所做的任何更改都必须对您的项目进行改造)