如何检测脚本是使用 npm 还是 yarn 运行?

Mir*_*rCZ 6 node.js npm npm-scripts yarnpkg

我需要为 npm 和 yarn 编写通用脚本。

npm 的 package.json:

{
  "scripts": {
    "build:clean": "rim-raf dist",
    "test:clean": "rim-raf coverage",
    "clean": "npm run build:clean; npm run test:clean"
  }
}
Run Code Online (Sandbox Code Playgroud)

纱线的 package.json:

{
  "scripts": {
    "build:clean": "rim-raf dist",
    "test:clean": "rim-raf coverage",
    "clean": "yarn run build:clean; yarn run test:clean"
  }
}
Run Code Online (Sandbox Code Playgroud)

用于 npm 和 yarn 的 package.json:

我通常使用小技巧:***$_***
{
  "scripts": {
    "build:clean": "rim-raf dist",
    "test:clean": "rim-raf coverage",
    "clean": "$_ run build:clean; $_ run test:clean"
  }
}
Run Code Online (Sandbox Code Playgroud)

但有时它不能正常工作。

存在一些合法的方法来做到这一点?

Mir*_*rCZ 8

我想我找到了最佳解决方案。

我在npm env 中搜索并将其与yarn env 进行了比较。我发现变量$npm_execpath包含使用的包管理器的路径。(对于 Windows %npm_execpath%

用于 npm 和 yarn 的 package.json:

{
  "scripts": {
    "build:clean": "rim-raf dist",
    "test:clean": "rim-raf coverage",
    "clean": "$npm_execpath run build:clean; $npm_execpath run test:clean"
  }
}
Run Code Online (Sandbox Code Playgroud)

我用于 npm 和 yarn 的最终解决方案 package.json 适用于 Linux、Windows、Mac:

如果添加包cross-var,脚本可以在 Linux、Windows 和 Mac 上运行。

{
  "scripts": {
    "build:clean": "rim-raf dist",
    "test:clean": "rim-raf coverage",
    "clean": "cross-var $npm_execpath run build:clean; cross-var $npm_execpath run test:clean"
  }
}
Run Code Online (Sandbox Code Playgroud)