使用watch的NPM脚本在CLI中工作但在npm脚本中断

时间:2017-05-28 18:30:50

标签: node.js npm sass watch

我正在尝试在Windows 10上设置以下npm脚本(使用git bash,MINGW):

package.json scripts的摘录:

...
"sass:build": "cat assets/styles/* | node-sass | postcss --no-map -u autoprefixer -u cssnano > dist/public/styles/styles.css.min",
"sass:watch": "watch sass:build ./assets/styles/",
...

运行npm i --save-dev node-sass postcss autoprefixer cssnano watch后,我收到此错误:

  

$ npm run sass:watch

     

> thenewells@0.0.0 sass:观看C:\ repos \ thenewells
  >看sass:build ./assets/styles/

     

>观看./assets/styles/
  文件名,目录名或卷标语法不正确。

但如果我做npm i -g node-sass postcss autoprefixer cssnano watch那么就会发生这种情况......

  

$ watch'npm run sass:build'./assets/styles/

     

>看着./assets/styles/

     

> thenewells@0.0.0 sass:build C:\ repos \ thenewells
  >猫资产/款式/ * | node-sass | postcss --no-map -u autoprefixer -u cssnano> dist / public / styles / styles.css.min

     

√完成标准差(373ms)

为什么普通的CLI版本工作,而npm脚本版本在尝试查找目录时出错?

我也尝试在sass:watch任务中加入'npm run sass:build'。同样的效果。我可以运行sass:通过npm run sass:build构建并且可以运行。

解决方法

我可以定义一个bash脚本来运行watch命令,但它可以工作。

sass-watch (没有文件扩展名,unix风格)

watch 'npm run sass:build' ./assets/styles/

现在 sass:watch 工作可以bash ./sass-watch

这很好用。所以我可以将它链接到一个更复杂的脚本链中,这样我就可以让我的npm run dev工作,但我宁愿不必在脚本中包含脚本来处理这种奇怪的用例。看起来我在sass:watch中写的原本应该起作用......:\

抛弃Windows并安装Ubuntu的另一个原因......?或者,npm是否对环境做了些什么,使得watch命令需要其他东西?

1 个答案:

答案 0 :(得分:1)

尝试使用引号括起命令并查看它是否有效:

"sass:watch": "watch \"npm run sass:build\" ./assets/styles/"

解释:

首先,它必须是npm run sass:build,而不是sass:build,因为这就是你运行你定义的npm脚本的方式。

其次,你必须引用命令的原因是watch正在使用minimist从process.argv读取命令,它将第一个参数视为命令,如果你不引用整个命令,它将是npm ,其余的参数都被视为它所监视的目录,这就是为什么你得到错误的文件名错误的原因。

第三,我不确定为什么单引号不起作用,也许这是与Windows和Mingw相关的问题,因为双引号和单引号之间的差异是一个将被评估,另一个将被字面处理在shell中。