自托管Azure DevOps Agent以NetworkService运行时npm install报错如何解决
问题根因
你遇到的npm ERR! Cannot read property 'startsWith' of null是npm 6.x版本的典型报错,触发原因就是代理配置为空或格式不合法。你当前环境的系统级HTTP_PROXY、HTTPS_PROXY环境变量不会被npm 6自动识别读取,加上Azure DevOps每次构建都会生成隔离的临时.npmrc文件(也就是你看到的每次路径不同的配置文件),默认不会写入代理配置,最终导致安装失败。
解决方法
方法一:为NetworkService用户配置全局npm代理(长期生效)
NetworkService用户的配置目录为日志中显示的C:\WINDOWS\ServiceProfiles\NetworkService\,按照以下步骤配置全局代理:
- 下载微软Sysinternals工具集的PsExec工具,打开管理员权限的命令提示符,执行命令切换到NetworkService用户上下文:
PsExec64.exe -i -u "NT AUTHORITY\NetworkService" cmd.exe - 在弹出的新命令行窗口中,执行以下命令配置全局代理:
# 无认证代理格式 npm config set proxy http://你的代理地址:代理端口 -g npm config set https-proxy http://你的代理地址:代理端口 -g # 有认证代理格式 npm config set proxy http://用户名:密码@你的代理地址:代理端口 -g npm config set https-proxy http://用户名:密码@你的代理地址:代理端口 -g
- 执行
npm config get proxy和npm config get https-proxy验证配置,返回正确的代理地址不为空即为配置成功。
方法二:在构建流程中添加临时配置步骤(无需修改全局配置)
直接在Azure DevOps流水线的npm install步骤前,新增一个命令行任务,执行以下命令,直接为本次构建的npm会话继承系统已经配置的代理环境变量:
npm config set proxy %HTTP_PROXY% npm config set https-proxy %HTTPS_PROXY%
该方案无需修改服务器全局配置,适配性更强,修改流水线后重新运行构建即可生效。
验证方案
配置完成后重新触发构建,若npm install步骤不再抛出startsWith相关报错即为修复成功。如果仍有问题,可以在构建任务中添加npm config ls命令,输出当前生效的所有npm配置,确认proxy和https-proxy字段存在且值正确。
内容的提问来源于stack exchange,提问作者Sebastian Siemens
相关产品推荐
相关产品推荐

