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

ken*_*tor 4 npm typescript npm-scripts

使用案例:

我在 NPM 中设置一个prepublishOnly钩子,它删除“lib”文件夹,然后将打字稿源文件转换到新的 lib 文件夹中,然后运行测试。

问题:

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

  "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"
    }
  },
Run Code Online (Sandbox Code Playgroud)

问题:

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

Rob*_*obC 5

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

\n\n
\n\n

解决方案1

\n\n

看看rimraf,它的描述是:

\n\n
\n

rm -rf节点的UNIX 命令。

\n
\n\n

用法

\n\n
    \n
  1. cd到您的项目目录并运行以下命令:

    \n\n
    npm install rimraf --save-dev\n
    Run Code Online (Sandbox Code Playgroud)
  2. \n
  3. clean将您的脚本更改package.json为以下内容:

    \n\n
    "scripts": {\n  "clean": "rimraf lib",\n  ...\n},\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
  5. clean:windows从您的脚本中删除该脚本package.json,因为它现在是多余的。

  6. \n
\n\n

注意,当我将其安装为本地依赖项时,我并没有取得很大的成功,因此我使用下面的解决方案二。然而,您可能会取得更大的成功 - 所以值得一试。

\n\n
\n\n

解决方案2

\n\n

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

\n\n

以下步骤展示了如何实现这一点:

\n\n
    \n
  1. cd到您的项目目录并通过运行以下命令安装shelljs :

    \n\n
    npm install shelljs --save-dev\n
    Run Code Online (Sandbox Code Playgroud)
  2. \n
  3. 创建自定义节点脚本如下,我们命名该文件clean.js:

    \n\n
    const shell = require(\'shelljs\');\n\nprocess.argv.slice(2).forEach(function(_path) {\n  shell.rm(\'-rf\', _path);\n});\n
    Run Code Online (Sandbox Code Playgroud)\n\n

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

    \n\n
    .\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .scripts\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 clean.js\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lib\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 node_modules\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
  5. clean将您的脚本替换package.json为以下内容:

    \n\n
    .\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .scripts\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 clean.js\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lib\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 node_modules\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n
    Run Code Online (Sandbox Code Playgroud)\n\n

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

    \n\n
    "scripts": {\n  "clean": "node .scripts/clean lib",\n  ...\n},\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    文件路径也被处理。例如:

    \n\n
    "scripts": {\n  "clean": "node .scripts/clean lib another/folder/path foo/bar",\n  ...\n},\n
    Run Code Online (Sandbox Code Playgroud)
  6. \n
  7. clean:windows从您的脚本中删除该脚本package.json,因为它现在是多余的。

  8. \n
\n\n

笔记

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

  2. \n
  3. 然后我们对索引中的参数数组进行切片()2,以确保我们只包含文件夹/文件路径参数(例如lib)。

  4. \n
  5. 最后,我们使用 循环遍历数组中的每个文件夹路径forEach(),并在循环的每一轮中调用shell.rm(\'-rf\', _path);以删除资产。

  6. \n
\n\n
\n\n

编辑/更新:

\n\n

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

\n\n
\n

shx是ShellJS Unix 命令的包装器,为 npm 包脚本中的简单类 Unix、跨平台命令提供简单的解决方案

\n
\n\n
    \n
  1. 运行以下命令进行安装shx:

    \n\n
    "scripts": {\n  "clean": "node .scripts/clean path/to/quux.js",\n  ...\n},\n
    Run Code Online (Sandbox Code Playgroud)
  2. \n
  3. 然后重新定义您的clean脚本,package.json如下所示:

    \n\n
    npm i -D shx\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
\n