资讯专栏INFORMATION COLUMN

Laravel 5.4 Mix执行 npm run dev时报错,提示cross-env not f

NusterCache / 1387人阅读

本文来自pilishen.com----原文链接; 欢迎作客我们的php&Laravel学习群:109256050

《Npm Debug Series》是我们课程laravel实战实战系列课程的扩展阅读篇,虽然视频中我们已经将npm install过程中的常见问题及解决方案都说了,但是鉴于npm的问题相对频繁,有随时查阅之需,故有此系列文章。

最近很多小伙伴在使用最新的laravel5.4来学习我们的laravel实战优雅入门:任务管理系统(一),在进行到第14节前端资源的管理与调用(elixir)时,当执行了npm run dev命令来编译前端资源时,经常会遇到一个报错,类似这样:

> Code@1.0.0 dev /home/vagrant/Code
> cross-env NODE_ENV=development webpack --progress --hide-modules

sh: 1: cross-env: not found

npm ERR! Linux 4.4.0-51-generic
npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "run" "dev"
npm ERR! node v7.8.0
npm ERR! npm  v4.2.0
npm ERR! file sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! syscall spawn
npm ERR! Code@1.0.0 dev: `cross-env NODE_ENV=development webpack --progress --hide-modules`
npm ERR! spawn ENOENT

或者说:

npm ERR! Failed at the @ dev script "cross-env NODE_ENV=development webpack --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js".

可能你具体的错误提示还稍有差异,不过这里先不管它,重点在于问题是出在cross-env这个组件上。

这个cross-env是个什么鬼?有什么用?
Most Windows command prompts will choke when you set environment variables with NODE_ENV=production like that. (The exception is Bash on Windows, which uses native Bash.) Similarly, there"s a difference in how windows and POSIX commands utilize environment variables. With POSIX, you use: $ENV_VAR and on windows you use %ENV_VAR%.

好吧,又是微软Windows的锅~也即是我们在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环境,如果你vagrant ssh进了虚拟机操作,那么就是Linux环境;

所以解决办法也要基于你的项目开发环境:

一、 Linux(Homestead)或Mac环境下:

你要做的,只是将你的package.json文件中的cross-env删掉即可:

"dev": "node  NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch": "node NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch-poll": "node NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --watch-poll --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"hot": "node NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
"production": "node NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
二、 Windows系统下(WAMP、MAMP)

首先你需要装一下cross-env,执行:

npm install --save-dev cross-env  --no-bin-links

或者你也可以全局安装一下cross-env,以防止以后在其他项目也出现类似错误:

npm install -g cross-env  --no-bin-links

package.json文件中的cross-env调用换成具体路径node_modules/cross-env/dist/bin/cross-env.js,最终类似这样:

"dev": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch-poll": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --watch-poll --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"hot": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
"production": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"

保险起见,再执行一下npm install --no-bin-links

然后再去执行npm run dev来试试

为什么会出来这么多梗?甚至很多人因此诟病laravel 5.4不友好——直接下载全新安装都跑不起来

因为一直到laravel 5.4.15,laravel的package.json是这样的:

{
  "private": true,
  "scripts": {
    "dev": "node node_modules/cross-env/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
    "watch": "node node_modules/cross-env/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
    "watch-poll": "node node_modules/cross-env/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --watch-poll --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
    "hot": "node node_modules/cross-env/bin/cross-env.js NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
    "production": "node node_modules/cross-env/bin/cross-env.js NODE_ENV=production node_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,于是在这个laravel commit里,package.json文件里更改了cross-env的路径,同时"devDependencies"里加上了"cross-env": "^3.2.3",然后没几天,作者们意识到既然依赖了cross-env,就没必要上面写具体路径了,所以在这个laravel commit里,package.json文件变成这样:

{
  "private": true,
  "scripts": {
    "dev": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
    "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
    "watch-poll": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --watch-poll --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
    "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
    "production": "cross-env NODE_ENV=production node_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而报错,也可能是路径变了以后没更新,也可能是laravel调用的版本一直太低,因为这期间你可能执行了`composer update`或`npm update`这些命令而导致两者的小版本都发生变化,所以说不清道不明的问题就发生了。
最后,向依然在Windows上裸奔的laravel开发者致以凝重的深望~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28245.html

相关文章

  • Laravel-Vue-SSR-SPA 服务端渲染/单页面渲染实现骨架

    摘要:提供服务端渲染单页面渲染实现骨架同时集成打包构建文件名实现内置等套件提供端渲染方案前后端分离单页面方案前后端分离单页面方案等三种常见方案项目地址欢迎项目需求基于和提供的强大的功能组合并根据已有项目实践经验提供完整的集成方案帮助快速 Laravel-Vue-SSR-SPA 提供服务端渲染/单页面渲染实现骨架, 同时集成webpack打包构建 MD5文件名/gzip 实现, 内置 vue-...

    zr_hebo 评论0 收藏0
  • Laravel-Vue-SSR-SPA 服务端渲染/单页面渲染实现骨架

    摘要:提供服务端渲染单页面渲染实现骨架同时集成打包构建文件名实现内置等套件提供端渲染方案前后端分离单页面方案前后端分离单页面方案等三种常见方案项目地址欢迎项目需求基于和提供的强大的功能组合并根据已有项目实践经验提供完整的集成方案帮助快速 Laravel-Vue-SSR-SPA 提供服务端渲染/单页面渲染实现骨架, 同时集成webpack打包构建 MD5文件名/gzip 实现, 内置 vue-...

    U2FsdGVkX1x 评论0 收藏0
  • Laravel Mix运行时关于es2015报解决方案

    摘要:概述系统环境最近在使用时,执行命令时报了解决方案在百度上搜了一圈,没有找到合适的答案。意外在上项目中的找到了对应的解答,方案如下在根目录增加文件,文件内容执行命令参考地址 概述 系统环境 2015 MacBook Pro 13.3 PHP 7.2.2 Laravel 5.7.9 Node v8.0.0 Npm 6.0.0 最近在使用Laravel Mix时,执行命令npm run...

    MRZYD 评论0 收藏0
  • Laravel 和 Vue 的项目搭建:基础篇

    摘要:此项目前端使用框架,加上这些常用扩展后的其中还加入了加载器解析工具前端动画等,不需要的可以自行删除。没有的,需要设置淘宝镜像,下载的是国外的镜像,速度慢而且可能出现下载失败的问题。 本篇只是实现了 基础 的功能,对于实际的项目中的权限等还未涉及,这些会在后期逐步完善。相关项目 laravel-vue-iview 的 GitHub 地址 戳这里,此项目基本可用于实际开发工作。 Lara...

    jiekechoo 评论0 收藏0
  • [译] Laravel-mix 中文文档

    摘要:原文地址镜像地址中文文档概览基本示例是位于顶层的一个简洁的配置层,在的情况下使用会使操作变的非常简单。在项目根目录下并没有配置文件,默认指向根目录下的配置文件。否则,它通常与需要删除的错误锁文件有关。该问题已被在修复。 原文地址: Laravel Mix Docs 镜像地址 : Laravel-mix 3.0 中文文档 概览 基本示例 larave-mix 是位于webpack顶层的一...

    K_B_Z 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<