转载

npm script与glob

好久好久好久没有写文章了,因为最近的闲暇时间全部贡献给了 nfm

现在是广告时间,nfm是一个基于nodejs的文件管理系统,目的是解决前端cdn静态资源的管理,前端使用react+redux实现,后端为nodejs,目前还没完成(努力中),欢迎大家star, https://github.com/keenwon/nfm 。

在写nfm单元测试的时候,遇到个诡异的问题…

先看测试的目录结构

. ├── controllers │   └── api │       ├── deploy.spec.js │       ├── fs.delete.spec.js │       ├── fs.mkdir.spec.js │       ├── fs.move.spec.js │       ├── fs.rename.spec.js │       ├── history.list.spec.js │       ├── history.restore.spec.js │       ├── list.spec.js │       ├── undeploy.spec.js │       └── upload.spec.js ├── eslint.spec.js ├── fetch.js └── service     ├── clean.backup.spec.js     └── clean.deploy.spec.js

spec.js 结尾的全部是测试文件,那么显然,npm script应该这样写:

{   "script": {     "test": "_mocha test/**/*.spec.js"   } }

但是悲剧的是,这样只执行了 service 目录下的文件

为什么会这样

那么为什么会这样呢?第一个想到的就是mocha的问题,检查之,在 node_modules/.bin 下的 _mocha 中输出 process.argv ,发现是已经解析好的两个文件。这个说, test/**/*.spec.js 传入前已经被解析好了。

那一定是istanbul的问题(用了istanbul检查覆盖率,具体见nfm源码),同样检查之,结果传入Istanbul的依然是解析好的文件。

难道是npm自己解析的?写个代码测一下:

. ├── node_modules │   └── .bin │       └── is └── package.json

其中,package.json代码为:

{   "name": "npmscript",   "version": "1.0.0",   "description": "",   "main": "index.js",   "scripts": {     "test": "is /your-path/test/**/*.spec.js"   },   "author": "",   "license": "ISC" }

除了test之外都是 npm init 初始化的,is的代码是:

#!/usr/bin/env node  console.log(process.argv);

直接执行测试,果然,npm script执行的时候会用shell本身的glob语法解析好。

那么现在的问题是,我用的是zsh,可能有人用的是其他的。每种的glob语法貌似又不一样(为什么是貌似,因为我还没来得及细查)。我们只能阻止glob语法在传入mocha前解析,而且传入mocha后,会使用glob模块解析,这样比较容易保证兼容性。所以,我们最初的代码这样改:

{   "script": {     "test": "_mocha /"test/**/*.spec.js/""   } }

ok,解决,见两个引号当字符串传入。完。

原文  http://keenwon.com/1565.html
正文到此结束
Loading...