【问题标题】:cross platform "rm" command跨平台“rm”命令
【发布时间】:2018-06-15 16:42:22
【问题描述】:

我的 package.json 目前有以下脚本,用于在我运行“npm run build”时删除我的 bundles 文件夹中的所有“.js”文件。在开发服务器中运行时它可以正常工作,但在 Windows 机器中运行时会中断。

{
  "scripts": {
    "build": "rm bundles/*.js && webpack",
  },
}

由于我正在对所有构建文件进行哈希处理,因此我需要在添加新文件之前将它们全部删除,这样我就不会得到一堆旧构建。

是否有适用于 Mac 和 Windows 的“rm bundles/*.js”?

【问题讨论】:

  • Mac 是 Unix,所以 rm 应该可以正常工作。

标签: node.js windows macos


【解决方案1】:

npm 包 rimraf 可用于scripts 中的命令行使用。

首先在本地安装到您的项目中:

$ npm install --save-dev rimraf

然后更新 package.json 文件中的 build 脚本:

"scripts": {
   "prebuild": "rimraf bundles/*.js",
   "build": "webpack"
}

rimraf 命令(以rm -rf 命名)删除文件。

文档:
https://www.npmjs.com/package/rimraf#cli

rimraf 是一个完善的项目,在 GitHub 上拥有超过 3,000 4,000 个 ⭐。

【讨论】:

    【解决方案2】:

    看看shelljs

    ShellJS 是 Unix 的可移植 (Windows/Linux/OS X) 实现 基于 Node.js API 的 shell 命令。你可以用它来消除 你的 shell 脚本对 Unix 的依赖,同时仍然保持它的 熟悉而强大的命令。您也可以全局安装它 您可以从外部节点项目运行它 - 告别那些 粗糙的 Bash 脚本!

    还有shelljs/shx,它提供了以下示例:

    {
      "scripts": {
        "clean": "shx rm -rf build dist && shx echo Done"
      }
    }
    

    另一种选择:

    您可能还想看看GulpGrunt,两者都称为Task Runners。 Gulp 有gulp-clean,Grunt 有grunt-contrib-clean。两者都旨在删除文件夹和/或文件。

    我们以 Grunt 为例:

    1. 将带有npm i -g grunt-cli 的 Grunt CLI 添加到您的系统中
    2. 使用npm i --save-dev grunt grunt-contrib-clean将所需的包添加到您的项目中
    3. 创建一个名为gruntfile.js的文件
    4. 添加以下行:
    module.exports = (grunt) => {
      'use strict';
    
      grunt.initConfig({
        clean: ['bundles'],
      });
    
      grunt.loadNpmTasks('grunt-contrib-clean');
    
      grunt.registerTask('default', ['clean']);
    };
    
    1. 更新你的脚本"build": "grunt && webpack"

    【讨论】:

    • 你是不是在暗示我的 package.json 中没有办法编写可以在 Mac 和 Windows 上运行的命令?
    • npm 的 shx 非常完美,谢谢。
    • 我试过这个 npm 脚本:"test": "tsc && shjs rm -rf testOutput" 但是得到 ShellJS: script not found (rm)
    • @SuperUberDuper 试试shx 而不是shjs
    【解决方案3】:

    如果您不关心 'rm/del not found' console.log,这里是简短的解决方案,不需要额外的依赖项,rm 适用于 Mac 和 Linux,del 适用于 Windows:

    {
      "scripts": {
        "build": "(rm bundles/*.js || del bundles/*.js) && webpack",
      },
    }
    

    【讨论】:

      【解决方案4】:

      更新recursive-fs 添加了用于删除文件夹的 CLI,因此您现在可以执行以下操作:

      "scripts": {
          "clean": "recursive-delete \"./bundles\""
      }
      

      原创: 如果你决定不需要 11 个额外的包来删除一个文件夹,你可以使用recursive-fs 和一个简短的脚本:

      node -e \"require('recursive-fs').rmdirr(require('path').resolve('bundles'), ()=>{})\"
      

      或者,有人可以编写一个 NPM 包来执行此操作,并且只对 recursive-fs 有一个依赖项,这仍然会使它比 rimraf 少 9 个包。另一种选择是 fork recursive-fs 并发布一个包含 CLI 的 NPM 包,以便更轻松地使用它进行递归删除。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-21
        • 1970-01-01
        • 2014-02-20
        • 2012-04-27
        • 1970-01-01
        • 1970-01-01
        • 2012-05-13
        • 1970-01-01
        相关资源
        最近更新 更多