在 macOS 构建 PowerShell 时 dotnet restore 报 Too many open files 错误怎么解决
【免费下载链接】PowerShellPowerShell for every system!项目地址: https://gitcode.com/GitHub_Trending/po/PowerShell
在 macOS 上从源码构建 PowerShell 时,执行Start-PSBuild会在内部的dotnet restore阶段失败,报错Too many open files。根据 docs/building/macos.md,这个错误源于 NuGet 的一个 bug:在不提高文件描述符上限的情况下,dotnet restore命令会失败。解决方法是在当前 shell 会话中执行ulimit -n 2048抬高上限,再重新触发构建。
适用环境:macOS(文档说明该构建链路所依赖的 .NET Core 只支持 macOS 10.13 及以上),并已按 docs/building/macos.md 准备好构建环境。
错误出现的位置
macOS 的构建流程与 Linux 几乎相同,docs/building/macos.md 是对 docs/building/linux.md 的补充。按文档准备环境的路径是:
- 安装 Homebrew 或 MacPorts(文档中说明的 macOS 包管理器)。
- 下载并安装一份自托管的 PowerShell。Linux 指南给出的做法是在仓库根目录运行
./tools/install-powershell.sh,然后执行pwsh进入 PowerShell 会话。 - 导入构建模块并安装依赖:
Import-Module ./build.psm1 Start-PSBootstrapStart-PSBootstrap会做三件事:通过brew或port安装 OpenSSL 和 GNU WGet;卸载任何旧版本的 .NET CLI;下载并安装 .NET Core SDK 到~/.dotnet。注意它包含卸载已有 .NET CLI 的动作,如果机器上还有通过其他途径安装的 .NET SDK,需要先了解这一点。
环境就绪后,构建命令是:
Start-PSBuild -UseNuGetOrgPowerShell 项目默认引用需要认证的私有 Azure Artifacts 包源,-UseNuGetOrg参数会把构建切换为使用公开的 NuGet.org 源。
dotnet restore就是在Start-PSBuild执行期间被触发的。此时若 macOS 的文件描述符上限保持默认值,构建就会以Too many open files报错中断。
解决方法:抬高文件描述符上限
文档给出的修复命令是:
ulimit -n 2048- 在当前终端会话中直接运行该命令,即可修复本次会话内的问题;
- 想一劳永逸,把这条命令加进你的 shell profile,之后每次打开终端都会自动生效。文档没有指定具体的 profile 文件名,按你当前使用的 shell 的惯例放置即可。
文档同时说明了一个边界:构建模块本身无法替你执行这条命令(对应 PowerShell 项目的 issue 847),所以这一步必须由你手动完成。如果你新开一个终端窗口,ulimit -n 2048的会话级设置不会保留,要么重新执行一次,要么依赖 profile 里的持久化配置。
重新构建并验证结果
在同一终端会话中(即刚执行过ulimit -n 2048的会话),重新运行:
Start-PSBuild -UseNuGetOrg成功的判断标准以文档描述为准:
dotnet restore不再报Too many open files,构建流程继续走完;- 构建完成后,产物位于文档指定的路径:
./src/powershell-unix/bin/Debug/net6.0/osx-x64/publish/pwsh。
运行这个刚构建出来的可执行文件,就能得到你亲手构建的 PowerShell,用它验证构建结果是否符合预期。
注意事项
ulimit -n 2048只抬高当前会话的软上限,不会影响系统全局配置;如果会话内执行后仍然报错,先确认命令是在触发构建的同一个终端里执行的,而不是另一个已打开的会话。- 本文路径针对 macOS 构建。在 Linux 上构建时,docs/building/linux.md 给出的产物路径为
./src/powershell-unix/bin/Debug/net11.0/linux-x64/publish/pwsh,与 macOS 文档中的路径不同,不要混用两份文档的路径。 - 如果
dotnet restore因为依赖变更(project.json变化)而非文件数上限失败,docs/FAQ.md 给出的对应手段是手动执行dotnet restore或使用Start-PSBuild -Restore,这与本文的Too many open files报错是两种不同的故障,不要对调处理方式。
【免费下载链接】PowerShellPowerShell for every system!项目地址: https://gitcode.com/GitHub_Trending/po/PowerShell
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考