如何在 package.json 中动态选择包管理器

Posted

技术标签:

【中文标题】如何在 package.json 中动态选择包管理器【英文标题】:how to dynamically select package manager in package.json 【发布时间】:2017-09-11 07:42:16 【问题描述】:

我目前使用yarn 作为我的包管理器,但我团队中的一些人可能仍然使用npm。我在package.json写了几个脚本

"scripts": 
  "clear": "rm -Rf app/javascripts/* & rm index.html",
  "watch": "yarn clear | NODE_ENV=development webpack -w --env.dev",
  "build": "yarn clear && yarn dev && yarn start",
  "dev": "yarn clear | NODE_ENV=development webpack --env.dev",
  "prod": "yarn clear | NODE_ENV=production webpack --progress --env.prod"

如果我想在其他脚本中调用clear,我必须使用npm clearyarn clear。由于当前编写的脚本,没有安装yarn 的人会遇到错误。

有没有办法让我写这个package.json,这样无论有人运行npm build 还是yarn build,它都能正常工作,并且它会使用他们选择的包管理器?

【问题讨论】:

【参考方案1】:

您可以使用变量npm_execpath,它将指向用于运行脚本的包管理器。

例如这会输出yarnnpm的版本:

"scripts": 
  "version": "$npm_execpath -v",

$ npm run version
> 3.10.10
$ yarn run version
> 0.21.3

【讨论】:

以上是关于如何在 package.json 中动态选择包管理器的主要内容,如果未能解决你的问题,请参考以下文章

package.json 与 package-lock.json 的关系

npm包信息写入package.json文件时,-D和-S的区别

如何修复 package-lock.json 中未在 package.json 中列出的易受攻击的 npm 包?

如何在 package.json 中为包提供自定义 url

如何在 package.json 中选择“模块”而不是“主”文件

包管理工具深度解析