为什么我不使用 npm 安装 yarn?

Why wouldn't I use npm to install yarn?

the blog post announcing yarn (an alternative npm client) they say, "The easiest way to get started is to run npm install -g yarn". But if you go to the "install yarn" page in their docs 中,"npm install yarn" 未列在任何特定于平台的安装页面上,它仅作为 "Alternatives" 页面上三个选项中的第三个提供。此外,当您 npm install yarn 时,它会打印弃用警告,"It is recommended to install Yarn using the native installation method for your environment." 所以我的问题是,如果 npm install 是最简单的安装方法,为什么它不是他们文档中推荐的方法?使用 npm 安装 yarn 有缺点吗?

因为 npm 不是特定于平台的,几乎可以在任何系统上运行,所以它被列为替代方案。与特定于平台的安装相比,没有优势或劣势。区别在于安装位置,但所有方法都将全局 yarn 命令公开给您的 CLI。

我认为他们将其列为 "the easiest way" 因为大多数人已经非常熟悉 npm

通过 npm 安装 Yarn 没有明显的缺点。事实上,我自己选择这种方法是因为以下几个原因:

  1. 这显然是最简单的方法。 npm i --global yarn 还有你 可以立即在您的控制台上将 npm 替换为 yarn
  2. 如果您使用 nvm 并在每个 NodeJS 版本上维护不同的代码项目,那么您可以在一个版本上安装 Yarn 而在另一个版本上不安装它
  3. 老实说,我能想到的在平台特定安装中没有提到它的唯一原因是 npm 与平台无关

编辑(2020/11/23):

感谢@Kissaki 在评论中提供有关 Yarn 建议的更新。

从 Yarn 2.x 开始,Yarn 团队改变了他们的建议,现在建议通过 npm 安装该工具。该建议围绕锁定每个项目使用的 Yarn 版本的优势展开。这允许项目对 Yarn 版本之间的变化具有弹性。

来自新的 Yarn "Installation" page:

Using a single package manager across your system has always been a problem. To be stable, installs need to be run with the same package manager version across environments, otherwise there's a risk we introduce accidental breaking changes between versions - after all, that's why the concept of lockfile was introduced in the first place! And with Yarn being in a sense your very first project dependency, it should make sense to "lock it" as well.

For this reason, Yarn 2 and later are meant to be managed on a by-project basis.

这类似于其他基于每个项目锁定构建工具版本的方法。有关示例,请参见 Gradle Wrapper

独立 Yarn 安装的优势很快就会瓦解,尤其是随着 Yarn 团队方向的改变。现在建议通过 npm 安装,从 Yarn 2.x.

开始,他们的网站上似乎不再提供独立安装的说明。

原答案:

根据 Yarn 项目维护者的说法,通过 npm goes against the goals of the project 安装 Yarn 可能会导致问题,并且通常比特定于平台的安装方法更糟糕。


推荐的特定平台安装的优点:

  • Yarn 团队认为 npm 不安全且不可靠。来自 Yarn 的“通过 npm 安装”部分 "Installation" page:

Note: Installation of Yarn via npm is generally not recommended. Installing Yarn with npm is non-deterministic, the package is not signed, and the only integrity check performed is a basic SHA1 hash, which is a security risk when installing system-wide apps.

For these reasons, it is highly recommended that you install Yarn through the installation method best suited to your operating system.

  • 运行 Yarn,它是一个单独的包管理器实用程序,通过 npm 可能会导致边缘情况问题(参见 issue 2072
  • 通过系统包管理器安装将 Yarn 与 npm 分离,允许您 运行 Yarn 没有 npm
  • 系统包管理器通常 运行 定期更新,保持 Yarn 更新
  • 通过 npm 安装 Yarn 是 slow

npm install -g yarn的优势:

  • 快速简单 (npm install -g yarn)
  • 可以在任何 npm 环境中完成(与平台无关)
  • Node.js 开发人员
  • 熟悉的范例和流程
  • 可以轻松更新 (npm update -g yarn)
    • 存在 Yarn 更新命令 (yarn self-update),但它似乎是 broken
  • 不依赖于系统包管理器
  • 可以通过nvm
  • 为不同的项目或不同版本的Node.js使用不同版本的Yarn

推荐安装的系统包管理器参数在提到 Windows 时往往会崩溃,那里没有官方包管理器(除非你算上 Windows 更新)。此外,Windows 包管理器(例如 Chocolatey)通常未配置为自动更新。

我不确定我是否完全同意 Yarn 团队对此的决定,但他们确实提出了一些公平的观点。 Yarn 项目还很年轻,如果它要成为 npm 的替代品,那么鼓励 npm 作为其主要安装程序是没有意义的。

无论如何,在大多数情况下,目前通过 npm 安装似乎都可以正常工作。


来源:

我不使用 npm 安装 yarn,因为:截至 2022 年 5 月,根据 nvm 和 Yarn 的官方文档通过 npm 在 ubuntu 上安装会破坏 capistrano 脚本。

bash: yarn: command not found

Yarn 在 ssh 终端会话中工作。

详细说明“为什么某些东西在我的 SSH 会话中有效,但在 Capistrano 中却无效?” https://capistranorb.com/documentation/faq/why-does-something-work-in-my-ssh-session-but-not-in-capistrano/

所以我删除了 nvm nodejs yarn 的默认安装,

$ npm uninstall -g yarn
$ nvm deactivate
$ nvm uninstall 16.15.0
$ nvm unload
$ rm -r ~/.nvm

并像这样安装纱线:

$ curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
$ curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/yarnkey.gpg >/dev/null
$ echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
$ sudo apt-get update && sudo apt-get install yarn
$ node -v
v16.15.0
$ npm -v
8.5.5
$ yarn -v
1.22.19

Capistrano 脚本现在可以使用了。