Javascript 如何在npm脚本全局模式中使用否定?

Javascript 如何在npm脚本全局模式中使用否定?,javascript,npm,npm-scripts,Javascript,Npm,Npm Scripts,我正在尝试创建一个cleannpm脚本,但是我继续在控制台中得到一个错误,或者期望的效果没有发生。我正在尝试删除除一些配置文件之外的所有根JavaScript文件 下面将删除所有忽略否定语法的文件 "clean": "rm -rf lib [a-z].js !*.config.js !*.support.js" 下面的代码在控制台中抛出一个错误 "clean": "rm -rf lib !(*.config|*.support).js" 利用并用JSON转义双引号包装复杂的全局模式,即\“…

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

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

"clean": "rm -rf lib [a-z].js !*.config.js !*.support.js"
下面的代码在控制台中抛出一个错误

"clean": "rm -rf lib !(*.config|*.support).js"
利用并用JSON转义双引号包装复杂的全局模式,即
\“…\”

例如:

“干净”:“rimraf lib\”!(*.config |*.support.js\“”
这个例子(上面)

  • 从项目目录的根目录中删除
    lib
    目录
  • 从项目目录的根目录中删除所有
    .js
    文件。但是,以
    .config.js
    .support.js
    结尾的文件(例如
    foobar.config.js
    quox.support.js
    )将被否定
  • 编辑:通过npm脚本使用以下bash命令也可以获得所需的结果:

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

    但是,我会选择前面提到的
    rimraf
    方法,以提高跨平台的可移植性,包括Windows
    cmd.exe

    您是否尝试使用正则表达式模式调用unix命令
    rm
    ?请注意,您试图运行的命令可能是特定于shell的(bash、zsh、ksh等),因此您可能需要研究如何使用模块,因为在不使用否定时,模块工作正常。我可以指定要删除的特定文件和文件夹,但当我尝试执行除配置文件以外的所有根js时,我遇到了问题。@smac89我在使用
    rimraf
    时遇到了相同的问题,因此我切换回
    rm
    @smac89-例如
    [a-z]
    ,在某些glob实现中受支持。OP中的第一个示例实际上对我很有用,它通过CLi和npm脚本直接运行。但是,OP第2个示例中的扩展glob模式直接通过CLI工作(使用
    shopt-s extglob
    即extglob设置为on),但通过npm脚本失败。我认为你建议的
    rimraf
    可移植性/跨平台性是正确的。根据我的回答,在npm脚本中使用带有扩展glob模式的
    rimraf
    确实需要包装在
    \“…\”
    中。我认为OP中的
    rm-rf
    CMD不能通过npm脚本成功运行的原因是npm使用
    sh
    而不是
    bash
    来执行脚本(
    sh
    不支持扩展globs)。自npm v5.1引入该选项以来。因此,(如果
    rm-rf
    命令实际上直接通过CLI成功运行),您可以尝试:1)运行
    哪个bash
    ,它将返回路径,例如
    /bin/bash
    。2) 运行
    npm config set script shell”/bin/bash“
    设置要使用的shell。3) 然后再次尝试运行原始npm脚本。
    Syntax error: "(" unexpected