强制纱线安装,而不是节点模块的npm安装?

我想强制使用yarn install而不是npm install 。 我想在npm install引发错误。 我应该怎么做package.json

在预安装脚本中,您可以运行一个适用于所有平台的迷你节点脚本,而像pgrep (以及其他常见的* nix命令和运算符)在Windows 10得到广泛采用之前无法在Windows上运行。

我在Node v4.7.0(npm v2.15.11)和Node v7.2.1(npm v3.10.10)上testing了下面的脚本。 我认为它适用于中间的一切。 它通过检查当前正在运行的进程的环境variables来工作 – npm_execpath是当前正在运行的“npm”脚本的path。 在纱线的情况下,它应该指向/path/to/yarn/on/your/machine/yarn.js

 "scripts": { "preinstall": "node -e \"if(process.env.npm_execpath.indexOf('yarn') === -1) throw new Error('You must use Yarn to install, not NPM')\"" } 

注意:从亚历山大的答案更新 – 这不会工作,如果用户使用
npm install --ignore-scripts 。 请在信贷到期时给予贷款。

您可以在这里阅读更多有关npm脚本的信息: https ://docs.npmjs.com/misc/scripts

至于npm_execpath环境variables,虽然没有logging,我怀疑它会改变。 这是围绕npm多个主要版本,它并没有真正通过“有一个更好的名字”这个testing。

像其他答案一样,我build议使用preinstall脚本并检查您的环境。 对于一个便携式的解决scheme来说,如果另一个npm进程正在运行,那么这个解决scheme不会有误报,使用node -e 'JS_CODE'可能是最好的select。

在这个JS代码中,你可以使用以下命令来检查包pipe理器的path:

 process.env.npm_execpath 

纱线的二进制是yarn.js ,与NPM使用的npm-cli.js相比。 我们可以使用如下的正则expression式来检查这个string是否以yarn.js

 /yarn\.js$/ 

通过使用这个正则expression式,我们可以确定它不会在文件系统的早些时候意外匹配。 最有可能的yarn不会出现在文件path中,但您永远不能太确定。

这是一个最小的例子:

 { "name": "test", "version": "1.0.0", "scripts": { "preinstall": "node -e 'if(!/yarn\\.js$/.test(process.env.npm_execpath))throw new Error(\"Use yarn\")'" } } 

当然,用户仍然可以绕过这个检查,编辑JSON或使用--ignore-scripts选项:

 npm install --ignore-scripts 

您可以使用预安装钩子和一些shell脚本来实现这一点。

样本package.json:

  "scripts": { "preinstall": "pgrep npm && exit 1" } 

我刚刚发布了一个包含CLI的模块(对于npm preinstall脚本很有用): https : //github.com/adjohnson916/use-yarn

此外,我刚刚发布了一个帮助Danger检查缺lessyarn.lock变化的CI: https : //github.com/adjohnson916/danger-yarn-lock

另见这里的讨论: