今天有开发同事问我,在本机开发的windows上运行build命令报错,不知道是怎么回事。作为Mac用户,我当然不知道为什么。我去查看了一下,有错误。我们的开发构建命令都是基于npmscripts的,其实就是很简单的一句话:{"scripts":{..."build":"NODE_ENV=productionwebpack--progress--hide-modules"},...}该命令在Mac下运行良好,但在Windows下运行时报如下错误:0infoitworkedifendswithok1verbosecli['C:\\ProgramFiles\\nodejs\\node.exe',1verbosecli'C:\\ProgramFiles\\nodejs\\node_modules\\npm\\bin\\npm-cli.js',1verbosecli'run',1verbosecli'build']2使用npm@3.10的信息.83信息使用node@v6.9.14详细运行脚本['prebuild','build','postbuild']5信息生命周期@~prebuild:@6愚蠢的生命周期@~prebuild:没有用于预构建的脚本,继续7信息生命周期@~build:@8verboselifecycle@~build:unsafe-perminlifecycletrue9verboselifecycle@~build:路径:C:\ProgramFiles\nodejs\node_modules\npm\bin\node-gyp-bin;\node_modules\.bin;C:\Users\\bin;F:\Git\mingw64\bin;F:\Git\usr\local\bin;F:\Git\usr\bin;F:\Git\usr\bin;F:\Git\mingw64\bin;F:\Git\usr\bin;C:\Users\;\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\ProgramFiles(x86)\NVIDIACorporation\PhysX\Common;C:\ProgramFiles\nodejs;C:\Go\bin;C:\Users\\AppData\Local\Microsoft\WindowsApps;C:\Users\\AppData\Roaming\npm;F:\Git\usr\bin\vendor_perl;F:\Git\usr\bin\core_perl10详细生命周期@~build:CWD:11愚蠢生命周期@~build:Args:['/d/s/c',11sillylifecycle'NODE_ENV=productionwebpack--progress--hide-modules']12sillylifecycle@~build:Returned:code:1signal:null13infolifecycle@~build:Failedtoexecbuildscript14verbosestack错误:@build:`NODE_ENV=productionwebpack--progress--hide-modules`14verbosestack退出状态114verbosestackatEventEmitter.(C:\ProgramFiles\nodejs\node_modules\npm\lib\utils\lifecycle.js:255:16)14详细堆栈位于emitTwo(events.js:106:13)14详细堆栈位于EventEmitter.emit(events.js:191:7)14详细堆栈位于ChildProcess。<匿名>(C:\ProgramFiles\nodejs\node_modules\npm\lib\utils\spawn.js:40:14)14详细堆栈位于emitTwo(events.js:106:13)14详细堆栈位于ChildProcess.emit(events.js:191:7)14详细堆栈位于maybeClose(internal/child_process.js:877:16)14详细堆栈位于Process.ChildProcess。_handle.onexit(internal/child_process.js:226:5)15verbosepkgid@16verbosecwd17errorWindows_NT10.0.1439318errorargv"C:\\ProgramFiles\\nodejs\\node.exe""C:\\ProgramFiles\\nodejs\\node_modules\\npm\\bin\\npm-cli.js""run""build"19errornodev6.9.120errornpmv3.10.821errorcodeELIFECYCLE22error@build:`NODE_ENV=productionwebpack--progress--hide-modules`22errorExitstatus123errorFailedatthe@buildscript'NODE_ENV=productionwebpack--progress--hide-modules'.23error确保你有最新版本node.js和npminstold.23error如果你这样做,这很可能是包的问题,??23error不是npm本身的问题。23error告诉作者这在你的系统上失败了:23errorNODE_ENV=productionwebpack--progress--hide-modules23error您可以通过以下方式获取有关如何为该项目打开问题的信息:23errornpmbugs23error或者如果这不可用,您可以通过以下方式获取他们的信息:23errornpmownerls23error上面可能还有其他日志记录输出.24verboseexit[1,true]经过调试,问题出在命令本身。本同学开发了git-shell自带的命令行,支持linux命令的执行。比如我们直接在命令行执行:NODE_ENV=productionexportNODE_ENV=production就可以了,但是结合npmscripts,就跑不起来了。当我们去掉这个env设置,再次执行npmscripts命令:{"scripts":{..."build":"webpack--progress--hide-modules"},...}你会发现有没问题,当然结果不是我们想要的。该怎么办?可以将要执行的代码写在独立的JS中,使用node命令运行,例如:{"scripts":{..."build":"nodebuild/build.js"},...在build/build.js文件中设置执行环境等:varora=require('ora')varwebpack=require('webpack')varwebpackConfig=require('../webpack.config.js')process.env.NODE_ENV='production'varspinner=ora('buildingforproduction...')spinner.start()webpack(webpackConfig,function(err,stats){spinner.stop()if(err)throwerrprocess.stdout.write(stats.toString({colors:true,modules:false,children:false,chunks:false,chunkModules:false})+'\n')})这其实就是vue搭建脚手架的方式是自动生成的,果然最佳实践更靠谱。