Mac下VS/Rider编译项目时MSBuild无法执行npm i命令
问题:VS/Rider for Mac构建.NET 5项目时触发MSB3073错误(找不到npm命令)
场景与报错详情
在Mac上使用Visual Studio for Mac或JetBrains Rider构建.NET 5项目时,项目的csproj文件中配置了如下用于预处理Sass/JS的Target:
<Target Name="SassBuild" BeforeTargets="Build" Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <Exec Command="npm i" /> <Exec Command="npm rebuild node-sass" /> <Exec Command="npm run gulp-sass" /> <Exec Command="npm run gulp-js" /> </Target>
使用终端执行dotnet build或dotnet msbuild可正常构建,但在IDE内构建时抛出错误:
Error MSB3073: The command "npm i" exited with code 127. (MSB3073)
日志详情显示IDE无法找到npm命令:
Target SassBuild: npm i /var/folders/9l/d02_tk1j5f93vklft82p1z996dm09b/T/tmp89785a0aeebb4347a3696de11d8c281e.exec.cmd: line 2: npm: command not found PATH_TO_CSPROJ_HERE.csproj(232,5): error MSB3073: The command "npm i" exited with code 127. Done building target "SassBuild" in project "X.csproj" -- FAILED.
注:npm通过nvm安装,终端中可正常执行npm命令。
解决方案
1. 直接使用npm的完整路径替换命令中的npm
首先在终端执行which npm,获取npm的绝对路径,例如:/Users/你的用户名/.nvm/versions/node/v16.18.0/bin/npm
修改csproj中的Exec命令,将npm替换为完整路径:
<Target Name="SassBuild" BeforeTargets="Build" Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <Exec Command="/Users/你的用户名/.nvm/versions/node/v16.18.0/bin/npm i" /> <Exec Command="/Users/你的用户名/.nvm/versions/node/v16.18.0/bin/npm rebuild node-sass" /> <Exec Command="/Users/你的用户名/.nvm/versions/node/v16.18.0/bin/npm run gulp-sass" /> <Exec Command="/Users/你的用户名/.nvm/versions/node/v16.18.0/bin/npm run gulp-js" /> </Target>
2. 让IDE继承终端的环境变量
方式A:从终端启动IDE
终端中执行以下命令启动IDE,这样IDE会继承终端的环境变量(包括nvm配置的PATH):
- 启动Visual Studio for Mac:
open -a "Visual Studio" - 启动Rider:
open -a "Rider"
方式B:修改全局环境变量文件
如果习惯从Launchpad启动IDE,可将nvm的配置写入~/.zprofile(Mac的GUI应用会加载此文件的环境变量):
- 编辑
~/.zprofile文件:
export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
- 执行
source ~/.zprofile使配置生效,或重启Mac后再启动IDE。
3. 在csproj的Target中显式设置PATH环境变量
在SassBuild Target中,给每个Exec命令添加EnvironmentVariables参数,将nvm的node/bin目录加入PATH:
<Target Name="SassBuild" BeforeTargets="Build" Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <Exec Command="npm i" EnvironmentVariables="PATH=/Users/你的用户名/.nvm/versions/node/vxx.x.x/bin:%PATH%" /> <Exec Command="npm rebuild node-sass" EnvironmentVariables="PATH=/Users/你的用户名/.nvm/versions/node/vxx.x.x/bin:%PATH%" /> <Exec Command="npm run gulp-sass" EnvironmentVariables="PATH=/Users/你的用户名/.nvm/versions/node/vxx.x.x/bin:%PATH%" /> <Exec Command="npm run gulp-js" EnvironmentVariables="PATH=/Users/你的用户名/.nvm/versions/node/vxx.x.x/bin:%PATH%" /> </Target>
注意替换路径中的vxx.x.x为你实际使用的node版本号。
内容的提问来源于stack exchange,提问作者skynyrd
相关产品推荐
相关产品推荐

