NPM条件脚本(Windows / Mac)应执行不同的命令)

时间:2018-04-27 07:23:01

标签: typescript npm npm-scripts

使用案例

我在NPM中设置ActiveRecord::Result挂钩,删除“lib”文件夹,然后将打字稿源文件转换为新的lib文件夹,然后运行测试。

问题:

两个人应该发布NPM包,两者都在不同的操作系统(Windows / Mac)上工作。因此,删除文件夹的命令是不同的。

prepublishOnly

问题:

有没有办法有条件地运行NPM脚本(基于使用的操作系统),或者是否有一个可以在这些操作系统上运行的删除文件夹命令?

2 个答案:

答案 0 :(得分:3)

如果您只想通过跨平台方式通过npm脚本删除文件夹,那么将 gulp 添加到您的工具列表似乎是不必要的。对于轻量级解决方案,请考虑以下两种解决方案:

解决方案1 ​​

看看rimraf,它被描述为:

  

节点的UNIX命令rm -rf

<强>用法

  1. cd到项目目录并运行以下命令:

    npm install rimraf --save-dev
    
  2. clean中的package.json脚本更改为以下内容:

    "scripts": {
      "clean": "rimraf lib",
      ...
    },
    
  3. clean:windows删除package.json脚本,因为它现在是多余的。

  4. 注意在将其作为本地依赖项安装时,我没有取得很大的成功,因此我使用下面的解决方案二。但是你可能会取得更大的成功 - 所以值得一试。

    解决方案2

    以下解决方案使用shelljs rm命令,该命令类似于Unix rm -rf命令,除了它用于节点 - 因此它是跨平台的等效命令。

    以下步骤说明了如何实现这一目标:

    1. cd到项目目录并运行以下命令安装shelljs

      npm install shelljs --save-dev
      
    2. 按如下方式创建自定义节点脚本,让我们将文件命名为clean.js

      const shell = require('shelljs');
      
      process.argv.slice(2).forEach(function(_path) {
        shell.rm('-rf', _path);
      });
      

      并将其保存到项目根目录中名为.scripts的隐藏目录中。例如:

      .
      ├── .scripts
      │   └── clean.js
      ├── lib
      │   └── ...
      ├── node_modules
      │   └── ...
      ├── package.json
      ├── src
      │   └── ...
      └── ...
      
    3. clean中的package.json脚本替换为以下内容:

      "scripts": {
        "clean": "node .scripts/clean lib",
        ...
      },
      

      您也可以将多个路径参数传递给clean.js。例如:

      "scripts": {
        "clean": "node .scripts/clean lib another/folder/path foo/bar",
        ...
      },
      

      也处理文件路径。例如:

      "scripts": {
        "clean": "node .scripts/clean path/to/quux.js",
        ...
      },
      
    4. clean:windows删除package.json脚本,因为它现在是多余的。

    5. 备注

      1. clean.js利用内置process.argv的节点获取调用脚本时传递给Node的命令行参数数组。

      2. 然后我们slice()来自索引2的参数数组,以确保我们只包含文件夹/文件路径参数(例如lib)。

        < / LI>
      3. 最后,我们使用forEach()遍历数组中的每个文件夹路径,并在循环的每个回合中调用shell.rm('-rf', _path);以删除资产。

答案 1 :(得分:1)

我解决这类问题的方法是使用gulp来定义一组特定于操作系统的任务,因为你在那里编写的代码与操作系统无关。

您需要安装gulp作为依赖项,并在根目录中创建gulpfile.js。 在其中,定义一个删除文件夹的任务。

var gulp = require('gulp'),
    path = require('path'),
    fs = require('fs-extra');

const rootFolder = path.join(__dirname);
const libFolder = path.join(rootFolder, 'lib');

gulp.task('clean:lib', function () {
  return deleteFolder(libFolder);
});

function deleteFolder(folder) {
  return fs.removeSync(folder);
}

gulp.task('deleteLib', ['clean:lib']);

然后,在package.json脚本中,您可以执行&& gulp deleteLib。 (确保gulpfile中使用的包在package.json中作为dev-dependency安装!

代码未经测试并写在我的头顶,但它只是为了给你一个大致的想法。