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

Mat*_*mat 13 node.js npm package.json yarnpkg

我想强制使用yarn install而不是npm install.我想提出错误npm install.我该怎么办package.json

Rya*_*ale 17

更新: 亚历山大的答案是更好的解决方案.我正在为后人留下我的答案.我的回答的最初要点是表明你可以执行一个应该适用于所有平台的小节点脚本.

在您的预安装脚本中,您可以运行一个迷你节点脚本,该脚本应该可以在所有平台上运行,而像pgrepWindows(以及其他常见的*nix命令和运算符)之类的东西在Windows 10被广泛采用之前将无法在Windows上运行.

我在Node v4.7.0(npm v2.15.11)和Node v7.2.1(npm v3.10.10)上测试了以下脚本.我认为它适用于两者之间的一切.它的工作原理是检查当前正在运行的进程的环境变量 - 这npm_execpath是当前运行的"npm"脚本的路径.在纱线的情况下,它应该指向/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')\""
}
Run Code Online (Sandbox Code Playgroud)

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

至于npm_execpath环境变量,虽然没有记录,但我怀疑它会不会改变.它已经出现在多个主要版本中npm,并没有真正通过"这个更好的名称"测试.


Ale*_*ara 9

与其他答案一样,我建议使用preinstall脚本并检查您的环境.对于一个便携式解决方案,如果另一个npm进程正好运行则不会出现误报,使用node -e 'JS_CODE'可能是最好的选择.

在该JS代码中,您可以使用以下命令检查包管理器的路径:

process.env.npm_execpath
Run Code Online (Sandbox Code Playgroud)

yarn.jsnpm-cli.jsNPM使用的纱线相比,纱线的二进制是.我们可以使用如下所示的正则表达式来检查此字符串的结尾yarn.js.

/yarn\.js$/
Run Code Online (Sandbox Code Playgroud)

通过使用这个正则表达式,我们可以确定它不会在文件系统中的某个地方意外匹配.最有可能yarn不会出现在文件路径中,但您永远不会太确定.

这是一个最小的例子:

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

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

npm install --ignore-scripts
Run Code Online (Sandbox Code Playgroud)


Ada*_*mas 8

这里的大多数答案都涉及 hacky 脚本,但是我在Yarn github issue上发布了一种内置方法来实现这一点。与其他方式的 soe 不同,这适用于任何和所有 NPM 命令。

你在 package.json 中添加一个像这样的假引擎版本(你可能想要调整纱线和节点条目):

  "engines": {
    "npm": "please-use-yarn",
    "yarn": ">= 1.17.3",
    "node": ">= 12.5.0"
  }
Run Code Online (Sandbox Code Playgroud)

然后将 .npmrc 文件添加到项目根目录中:

engine-strict = true
Run Code Online (Sandbox Code Playgroud)

然后运行 ​​NPM 会引发错误:

npm ERR! code ENOTSUP
npm ERR! notsup Unsupported engine for root@: wanted: {"npm":"please-use-yarn","yarn":">= 1.17.3","node":">= 12.5.0"} (current: {"node":"12.9.1","npm":"6.10.2"})
npm ERR! notsup Not compatible with your version of node/npm: root@
Run Code Online (Sandbox Code Playgroud)


ato*_*tom 7

在尝试了这些选项并且不是很满意之后,我推荐only-allow

只需添加:

{
  "scripts": {
    "preinstall": "npx only-allow yarn"
  }
}
Run Code Online (Sandbox Code Playgroud)

我喜欢它提供了清晰的警告信息,以及如何安装纱线的说明:

only-allow 错误输出的屏幕截图

归功于Adam Thomas 的回答,他提供了推荐此内容的线程。

  • 为了安全起见,我建议任何要使用此脚本的人使用“npx only-allow@1.0.0 yarn”。 (2认同)