【问题标题】:How to use negation in npm script glob pattern?如何在 npm 脚本 glob 模式中使用否定?
【发布时间】:2019-01-27 06:14:19
【问题描述】:

我正在尝试创建一个clean npm 脚本,但我继续在控制台中收到错误,或者没有发生预期的效果。我正在尝试删除除一些配置文件之外的所有根 JavaScript 文件。

以下删除所有忽略否定语法的文件

"clean": "rm -rf lib [a-z].js !*.config.js !*.support.js"

以下在控制台中抛出错误

"clean": "rm -rf lib !(*.config|*.support).js"
Syntax error: "(" unexpected

【问题讨论】:

  • 您是否尝试使用正则表达式模式调用 unix 命令rm?这真的有效吗?
  • 请注意,您尝试运行的命令可能是特定于 shell 的(bash、zsh、ksh 等),因此您可能需要考虑使用 rimraf 模块
  • 我在不使用否定时可以正常工作。我可以指定要删除的特定文件和文件夹,但是当我尝试执行除配置文件之外的所有 root js 时,我遇到了问题。
  • @smac89 我在使用rimraf 时遇到了同样的问题,所以我切换回rm
  • @smac89 - Ranges 例如[a-z],在某些 glob 实现中受支持。 OP 中的第一个示例实际上对我有用,既可以通过 CLi 直接运行,也可以通过 npm 脚本运行。但是,OP 的第二个示例中的 extended glob 模式直接通过 CLI 工作(shopt -s extglobextglob 设置为 on)但通过 npm 脚本失败。我认为您建议rimraf 是对的,因为它具有可移植性/跨平台优势。根据我的回答,在 npm 脚本中使用带有 extended glob 模式的 rimraf 确实需要包含在 \"...\" 中。

标签: javascript npm npm-scripts


【解决方案1】:

利用 rimraf 并将复杂的 glob 模式包装在 JSON 转义双引号中,即 \"...\"

例如:

"clean": "rimraf lib \"!(*.config|*.support).js\""

这个例子(上)

  1. 从项目目录的根目录中删除lib 目录。
  2. 从项目目录的根目录中删除所有.js 文件。但是,以.config.js.support.js 结尾的文件(例如foobar.config.jsquux.support.js)将被否定。

编辑:通过 npm 脚本使用以下 bash find 命令也可以达到预期的效果:

"clean": "find . \\( -name '*.js' -o -name 'lib' \\) -not \\( -name '*.config.js' -o -name '*.support.js' \\) -maxdepth 1 -exec rm -rf {} \\;"

不过,我会选择上述rimraf 方法以提高跨平台的可移植性,包括Windows cmd.exe

【讨论】:

  • 我认为你的 OP 中的 rm -rf cmds 不能通过 npm 脚本成功运行的原因是因为 npm 使用 sh 而不是 bash 来执行脚本(sh 不'不支持扩展全局)。从 npm v5.1 开始,它引入了 script-shell 选项。因此,(如果 rm -rf 命令实际上直接通过 CLI 成功运行)您可以尝试:1) 运行 which bash,它将返回路径,例如/bin/bash2) 运行npm config set script-shell "/bin/bash" 设置要使用的shell。 3) 然后尝试再次运行您原来的 npm 脚本。
猜你喜欢
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多