node.js - npm glob 模式与子目录不匹配

标签 node.js npm mocha.js package.json

在我的 package.json 中,我有一个脚本 block ,它使用 **/*Test.js 来匹配文件。当通过 npm 运行时,它们不会匹配超过一级的子目录。当直接在命令行上执行时,它们会按预期工作。

谁能解释发生了什么,并提供解决方法或解决方案?

package.json

{
  "name": "immutable-ts",
  "scripts": {
    "test": "echo mocha dist/**/*Test.js",
  }
}

执行

% npm run test

> immutable-ts@0.0.0 test:unit .../immutable-ts
> echo mocha dist/**/*Test.js

mocha dist/queue/QueueTest.js dist/stack/StackTest.js

% echo mocha dist/**/*Test.js

mocha dist/queue/QueueTest.js dist/stack/StackTest.js dist/tree/binary/BinaryTreeTest.js

% ls dist/**/*                                                                                                                                                                                          

dist/collections.js  dist/queue/QueueTest.js  dist/tree/binary/BinaryTree.js      dist/immutable.js.map        dist/stack/Stack.js.map             dist/tree/binary/BinaryTreeTest.js.map
dist/immutable.js    dist/stack/Stack.js      dist/tree/binary/BinaryTreeTest.js  dist/queue/Queue.js.map      dist/stack/StackTest.js.map
dist/queue/Queue.js  dist/stack/StackTest.js  dist/collections.js.map             dist/queue/QueueTest.js.map  dist/tree/binary/BinaryTree.js.map

最佳答案

解决方案

更改您的脚本,以便您传递给 Mocha 的内容不会被 shell 扩展:

"scripts": {
    "test": "mocha 'dist/**/*Test.js'",
 }

注意 mocha 的参数周围的单引号。

说明

无需借助外部工具即可解决此问题。问题的根本原因是 npm 使用 sh 作为运行脚本命令的 shell。

绝大多数情况下,当 *nix 进程启动一个 shell 时,它会启动 sh ,除非有什么告诉它不这样做。您为登录设置的 shell 首选项并不构成“以其他方式告诉它”的方式。因此,如果你有,比如说,zsh 作为你的登录 shell,它并不意味着 npm 将使用 zsh

那些 sh 的实现不包含任何超出 sh 应该提供的扩展,但并不像您那样理解 ** glob想要它。据我所知,它被解释为 *。然而,Mocha 使用它的 glob 的 JavaScript 实现来解释传递给它的路径。因此,您可以通过保护您的 glob 不被 sh 解释来解决此问题。 考虑以下 package.json:

{
  "name": "immutable-ts",
  "scripts": {
    "bad": "mocha test/**/*a.js",
    "good": "mocha 'test/**/*a.js'",
    "shell": "echo $0"
  }
}

shell 脚本只是为了让我们可以检查哪个 shell 正在运行该脚本。如果你运行它,你应该会看到 sh

现在,给定以下树:

test/
├── a.js
├── b.js
├── x
│   ├── a
│   │   ├── a.js
│   │   └── b.js
│   ├── a.js
│   └── b
│       └── a.js
└── y
    ├── a.js
    └── q

所有 a.jsb.js 文件包含 it(__filename);。您会得到以下结果:

$ npm run bad

> immutable-ts@ bad /tmp/t2
> mocha test/**/*a.js

  - /tmp/t2/test/x/a.js
  - /tmp/t2/test/y/a.js

  0 passing (6ms)
  2 pending

$ npm run good

> immutable-ts@ good /tmp/t2
> mocha 'test/**/*a.js'

  - /tmp/t2/test/a.js
  - /tmp/t2/test/x/a.js
  - /tmp/t2/test/x/a/a.js
  - /tmp/t2/test/x/b/a.js
  - /tmp/t2/test/y/a.js

  0 passing (5ms)
  5 pending

关于node.js - npm glob 模式与子目录不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32017169/

相关文章:

node.js - 如何更新到 v13

reactjs - Chrome 无法使用 react-qr-reader - npm 访问 iPhone 相机

node.js - 使用 Mocha 和 Should.js 组织测试

node.js - 找不到 Npm 模块 "grunt-sass"。安装了吗?

javascript - Cypress:页面未在单击操作的第二个 'it' block 内加载

node.js - "node --debug"和 "node --debug-brk"无效

javascript - 如何在 NestJS 中记录所有 Axios 外部 http 请求

node.js - 如何只更新一次 MongoDB 文档字段?

javascript - 如何解决通过id查找item的问题?

javascript - 通过 Nodejs 将原始 HTML 发送到电子邮件 hoganjs 模板,从而在电子邮件客户端上提供原始 HTML 输出