首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NPM条件脚本(Windows / Mac)将执行不同的命令

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

Stack Overflow用户
提问于 2018-04-27 07:23:01
回答 2查看 2K关注 0票数 4

用例:

我正在NPM中设置一个prepublishOnly钩子,它删除" lib“文件夹,然后将类型记录源文件转到一个新的lib文件夹中,然后运行测试。

问题:

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

代码语言:javascript
复制
  "scripts": {
    "build": "tsc",
    "clean": "rm -rf lib",
    "clean:windows": "if exist lib rmdir /s /q lib",
    "lint": "tslint --project tsconfig.json --format stylish src/**/*.ts",
    "format": "prettier --write \"**/*.ts\""
  },
  "husky": {
    "hooks": {
      "pre-push": "npm run clean:windows && npm run build && npm run test"
    }
  },

问题:

是否有一种有条件地运行NPM脚本的方法(基于使用的操作系统),或者是否有一个在这些操作系统上工作的remove文件夹命令?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-27 11:47:28

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

解决方案1

看看里姆拉夫,它被描述为:

UNIX命令rm -rf用于节点。

使用

  1. cd到您的项目目录并运行以下命令: npm安装rimraf -save-dev
  2. clean脚本在package.json中更改为: “脚本”:{“干净”:"rimraf lib",. }
  3. 从您的clean:windows中删除package.json脚本,因为这是多余的。

Note我在将它作为本地依赖项安装时并没有取得很大的成功,因此我使用了下面的解决方案2。然而,你可能会有更大的成功,所以值得一试。

解决方案2

下面的解决方案使用了shelljs rm命令,它类似于Unix rm -rf命令,但它是用于节点的-因此它是一个跨平台的等价物。

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

  1. cd到您的项目目录,并通过运行以下命令安装贝壳类: npm安装shelljs --保存-dev
  2. 创建一个自定义节点脚本如下,让我们将文件命名为clean.js: Process.argv.slice(2).forEach(函数(_path){ shell.rm('-rf',_path);}) 并将其保存到项目根目录中名为.scripts的隐藏目录中。例如: 。采购产品名称:.scripts clean.js│└──└──├──lib│.scripts└──...├──└──...├──node_modules│src└──...├──└──...├──├──src│src└──...└──.
  3. clean脚本在package.json中替换为: “脚本”:{“干净”:“节点.脚本/清洁库”, 您还可以向clean.js传递多个路径参数。例如: “脚本”:{“干净”:“节点.脚本/清洁库另一个/文件夹/路径foo/bar", 文件也会被处理。例如: “脚本”:{“干净”:“节点.脚本/清洁路径/to/quux.js”,. },
  4. 从您的clean:windows中删除package.json脚本,因为这是多余的。

Notes

  1. clean.js利用节点内置的process.argv来获得调用脚本时传递给Node的命令行参数数组。
  2. 然后,我们将索引切片()中的参数数组设置为2,以确保只包含文件夹/文件路径参数(例如lib)。
  3. 最后,我们使用forEach()循环遍历数组中的每个文件夹路径,并在循环的每一轮调用shell.rm('-rf', _path);来删除资产。

编辑/更新:

另一种跨平台解决方案(最初发布此答案时不可用)是利用沙克斯包,它被描述为:

shx是围绕ShellJS Unix命令的包装器,它为npm包脚本中简单的类Unix跨平台命令提供了一个简单的解决方案。

  1. 运行以下命令来安装shx: npm i -D shx
  2. 然后将clean脚本重新定义为package.json,如下所示: “脚本”:{“干净”:"shx -rf lib“}
票数 5
EN

Stack Overflow用户

发布于 2018-04-27 07:35:57

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

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

代码语言:javascript
复制
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。(确保您的dev文件中使用的包是作为开发依赖项安装在package.json中的!)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50057368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档