Laravel5.4Mix执行npmrundev报错,提示cross-envnotfound原因及解决方法laravel实战系列课程的延伸阅读,虽然我们已经提到了过程中的常见问题及解决方法视频中的npminstall,但是鉴于npm问题比较频繁,需要随时参考,所以才有了这个系列文章。最近很多朋友都在使用最新的laravel5.4来学习我们优雅的laravel介绍:任务管理系统(一)。当我们去到14节前端资源(elixir)的管理和调用时,当我们执行npmrundev命令编译前端资源时,经常会遇到一个错误,类似这样:>Code@1.0.0dev/home/vagrant/Code>cross-envNODE_ENV=developmentwebpack--progress--hide-modulessh:1:cross-env:notfoundnpmERR!Linux4.4.0-51-genericnpm错误!argv"/usr/local/bin/node""/usr/local/bin/npm""run""dev"npm错误!节点v7。8.0npm错误!npmv4.2.0npm错误!文件shnpm错误!代码ELIFECYCLEnpm错误!errnoENOENTnpm错误!系统调用spawnpm错误!Code@1.0.0dev:`cross-envNODE_ENV=developmentwebpack--progress--hide-modules`npm错误!spawnENOENT或者更确切地说:npmERR!@dev脚本'cross-envNODE_ENV=developmentwebpack--progress--hide-modules--config=node_modules/laravel-mix/setup/webpack.config失败。js'。您的具体错误消息可能略有不同,但我们在这里忽略它。关键是问题出在cross-env组件上。这个交叉环境到底是什么?有什么用?当您像这样使用NODE_ENV=production设置环境变量时,大多数Windows命令提示符都会被阻塞。(例外是Windows上的Bash,它使用本机Bash。)同样,Windows和POSIX命令使用环境变量的方式也有所不同。对于POSIX,您使用:$ENV_VAR,在Windows上您使用%ENV_VAR%。嗯,又是MicrosoftWindows~也就是我们在windows系统上使用NODE_ENV=production来设置node环境的时候,因为windows系统变量是%ENV_VAR%的格式,而“行业标准”是$ENV_VAR当然,windows上的bash是个例外。所以为了解决跨平台环境变量的问题,就有了cross-env组件。知道这些有什么用?有用处在于cross-env只在windows系统上使用,在Mac和Linux系统上是没用的。不需要安装,但是会造成不好的事情~所以从这点来说,你的问题其实有两种可能:你的项目环境是windows系统,你没有安装cross-env,或者无法调用由于路径等其他原因。你的项目环境是Linux或Mac。这个时候不需要安装cross-env,但是你已经安装了,或者laravel默认有,安装就行了。路径调用经常是错误的。这里特别说明一下,如果你使用的是Homestead开发环境,因为你的虚拟机是Linux,所以如果你在Host主机上操作,那么你是在Windows环境下,如果你vagrantssh进入虚拟机进行操作,那么你在Linux环境中;所以解决方法也是根据你的项目开发环境:1.Linux(Homestead)或者Mac环境下:你只需要删除package.json文件中的cross-env:"dev":"nodeNODE_ENV=developmentnode_modules/webpack/bin/webpack.js--progress--hide-modules--config=node_modules/laravel-mix/setup/webpack.config.js","watch":"nodeNODE_ENV=developmentnode_modules/webpack/bin/webpack.js--watch--progress--hide-modules--config=node_modules/laravel-mix/setup/webpack.config.js","watch-poll":"nodeNODE_ENV=developmentnode_modules/webpack/bin/webpack.js--watch--watch-poll--progress--hide-modules--config=node_modules/laravel-mix/setup/webpack.config.js","hot":"nodeNODE_ENV=developmentnode_modules/webpack-dev-server/bin/webpack-dev-server.js--inline--hot--config=node_modules/laravel-mix/setup/webpack.config.js","production":"节点节点_ENV=productionnode_modules/webpack/bin/webpack.js--progress--hide-modules--config=node_modules/laravel-mix/setup/webpack.config.js"二、Windows系统(WAMP、MAMP)先你你需要安装cross-env,执行:npminstall--save-devcross-env--no-bin-links也可以全局安装cross-env,防止以后其他项目出现类似错误:npminstall-gcross-env--no-bin-links把package.json文件中的cross-env调用替换成具体路径node_modules/cross-env/dist/bin/cross-env.js,最后是这样的:"dev":"nodenode_modules/cross-env/dist/bin/cross-env.jsNODE_ENV=developmentnode_modules/webpack/bin/webpack.js--progress--hide-modules--config=node_modules/laravel-mix/setup/webpack.config.js","watch":"nodenode_modules/cross-env/dist/bin/cross-env.jsNODE_ENV=developmentnode_modules/webpack/bin/webpack.js--watch--progress--hide-模块--config=node_modules/laravel-mix/setup/webpack.config.js","watch-poll":"nodenode_modules/cross-env/dist/bin/cross-env.jsNODE_ENV=developmentnode_modules/webpack/bin/webpack.js--watch--watch-poll--progress--隐藏模块--config=node_modules/laravel-mix/setup/webpack.config.js","hot":"nodenode_modules/cross-env/dist/bin/cross-env.jsNODE_ENV=developmentnode_modules/webpack-dev-server/bin/webpack-dev-server.js--inline--hot--config=node_modules/laravel-mix/setup/webpack.config.js","production":"nodenode_modules/cross-env/dist/bin/cross-env.jsNODE_ENV=productionnode_modules/webpack/bin/webpack.js--progress--hide-modules--config=node_modules/laravel-mix/setup/webpack.config.js"用于保险,然后执行npminstall--no-bin-links再执行npmrundev试试为什么有这么多梗?甚至很多人批评laravel5.4不友好——直接下载一个新安装无法运行,因为直到laravel5.4.15,laravel的package.json是这样的:bin/webpack.js--progress--hide-modules--config=node_modules/laravel-mix/setup/webpack.config.js","watch":"nodenode_modules/cross-env/bin/cross-env.jsNODE_ENV=developmentnode_modu节点模块/cross-env/bin/cross-env.jsles/webpack/bin/webpack.js--watch--progress--hide-modules--config=node_modules/laravel-mix/setup/webpack.config.js","watch-poll":"节点节点模块/交叉-env/bin/cross-env.jsNODE_ENV=developmentnode_modules/webpack/bin/webpack.js--watch--watch-poll--progress--hide-modules--config=node_modules/laravel-mix/setup/webpack.config.js","hot":"nodenode_modules/cross-env/bin/cross-env.jsNODE_ENV=developmentnode_modules/webpack-dev-server/bin/webpack-dev-server.js--inline--热--config=node_modules/laravel-mix/setup/webpack.config.js","production":"nodenode_modules/cross-env/bin/cross-env.jsNODE_ENV=productionnode_modules/webpack/bin/webpack.js--progress--hide-modules--config=node_modules/laravel-mix/setup/webpack.config.js"},"devDependencies":{"axios":"^0.15.3","bootstrap-sass":"^3.3.7","jquery":"^3.1.1","laravel-mix":"^0.8.1","lodash":"^4.17.4","vue":"^2.1.10"}}可以看到它的devDependencies中没有对cross-env的依赖,但是上面声明了cross-env的路径:node_modules/cross-env/bin/cross-env.js,因为laravel-mix组件中使用了cross-env但是没过多久,cross-env的作者对组件路径做了改动,将cross-env/bin换成了cross-env/dist,所以在这次laravelcommit中,package.json文件把cross-env的路径改在了同时在“devDependencies”中添加了“cross-env”:“^3.2.3”,没过几天,作者就意识到既然依赖cross-env,就不用写具体路径了它,所以在这个laravel的commit中,package.json文件变成了这样:js--progress--hide-modules--config=node_modules/laravel-mix/setup/webpack.config.js","watch":"cross-envNODE_ENV=developmentnode_modules/webpack/bin/webpack.js--watch--progress--hide-modules--config=node_modules/laravel-mix/setup/webpack.config.js","watch-poll":"cross-envNODE_ENV=development节点模块/webpack/bin/webpack.js--watch--watch-poll--progress--hide-modules--config=node_modules/laravel-mix/setup/webpack.config.js","hot":"cross-envNODE_ENV=developmentnode_modules/webpack-dev-server/bin/webpack-dev-server.js--inline--hot--config=node_modules/laravel-mix/setup/webpack.config.js","production":"cross-envNODE_ENV=productionnode_modules/webpack/bin/webpack.js--progress--hide-modules--config=node_modules/laravel-mix/setup/webpack.config.js"},"devDependencies":{"axios":"^0.15.3","bootstrap-sass":"^3.3.7","cross-env":"^3.2.3","jquery":"^3.1.1","laravel-mix":"^0.8.1","lodash":"^4.17.4","vue":"^2.1.10"}}期间,laravel-mix的作者Jeffway看到laravel依赖cross-env,于是直接在laravel-mix中取消了对cross-env的依赖,因为不需要重复安装,直接导致了一系列的问题。而在这期间,laravel对cross-env的依赖一直停留在"cross-env":"^3.2.3",直到5.4.30,突然变成了"cross-env":"^5.0.1"。所以,根据你使用的laravel和laravel-mix的版本,可能是你的package.json中没有cross-env而报错,或者是更改后路径没有更新,或者verlaravel调用的sion一直太低,因为这期间你可能执行了`composerupdate`或`npmupdate`这些命令,导致两者的minorversion都发生了变化,所以出现了不清楚的问题。终于开发到laravel了,在windows上还是裸奔的,各位读者寄予凝重的深切期盼~
