npm run scripts 脚本在mac上正常执行,但是windows下不能正常执行,后发现是环境问题,为什么会这样

直接上手package.json文件的代码。

  "scripts": {
    "watch": "../scripts/watch.js --watch",
  },

当我在命令行执行npm run watch的时候,在mac下正常,但是在windows下就报错。

windows 报错信息

    > ./scripts/watch.js --watch

'.' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! aaaaa-wxapp@1.0.0 watch: `./scripts/watch.js --watch`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the aaaaa-wxapp@1.0.0 watch script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\29656\AppData\Roaming\npm-cache\_logs\2018-02-24T03_30_38_264Z-debug.log

但是经过修改之后,我发现是执行环境的问题

windows 修改之后的代码

  "scripts": {
    "watch": "node ../scripts/watch.js --watch",
  },

在windows环境下,执行npm run watch能正常执行了。
因为在package.json中明确定义了,脚本执行环境是node下执行,但是我想知道为什么要这样,是什么问题造成了我们必须在windows下这样写呢。

阅读 6.4k
4 个回答

因为 ... 是 Unix 平台的两个目录链接,而 Windows 上的 cmd 不支持。你可以用 Powershell 执行 npm 命令,它兼容 ...

npm scripts相当于命令行代码的别名
`

"scripts": {
    "watch": "../scripts/watch.js --watch",
},

`
watch命令不是可执行的命令,所以执行的时候会报错,至于为什么在mac上正常执行,我也不清楚,穷鬼没有Mac。

package.json里的scripts实际上就是在执行bash(unix)和cmd(windows)命令, 只不过会先把./node_modules/bin/先加到PATH里

在cmd里目录层级是用\分割的, 所以执行./scripts/watch.js --watch时并不能把前面的部分识别为一个文件

但如果你使用.\scripts\watch.js --watch的话会启动js文件的默认打开程序来打开这个文件而非执行

在类unix系统则可以通过hashbang语法来指定执行程序所以不会出问题

用node来执行的话文件名只是一个参数, 如何解析取决于node的实现, 而不是cmd或bash

windows路径里面没有 .. 这样的用法

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题