yarn 和 npm 在实践中可以互换吗?

Posted

技术标签:

【中文标题】yarn 和 npm 在实践中可以互换吗?【英文标题】:Are yarn and npm interchangeable in practice? 【发布时间】:2017-04-05 05:33:45 【问题描述】:

我有一个包含 package.json 文件和安装 bash 脚本的项目,除其他步骤外,该脚本运行 npm install

我正在考虑更新脚本,以便它在yarn 可用时运行yarn install(以利用纱线的缓存、锁文件等),否则回退到npm install。据我所知,无论哪种方式,所有软件包似乎都可以安装和工作。

yarnnpm 是否可以互换,从而成为一种可行的方法?还是有可能导致的潜在问题?我们是打算只选择一个,还是在实践中 yarn 可以与 npm 互换?

(nb。我已阅读此closely related question,但我将此作为一个单独的问题提出,因为它是关于在项目中明确支持 yarn 和 npm 安装过程)

【问题讨论】:

【参考方案1】:

Yarn 和 npm(版本 >=3.0.0)应该是相对兼容的,尤其是从 npm Yarn,因为兼容性是one of the stated goals of Yarn。如Migrating from npm中所述:

Yarn 可以使用与 npm 相同的 package.json 格式,并且可以从 npm 注册表安装任何包。

因此,理论上,任何对 npm 有效的 package.json 也应该同样适用于 Yarn。请注意,我说 npm v2 可能不太兼容——这是因为 npm 从嵌套的 node_modules 结构迁移到了平面布局(这是 Yarn 使用的)。也就是说,Yarn 和 npm v3 应该产生非常相似的布局,因为正如问题 I linked 中所述:

对于需要这种兼容性的人,我们应该尽量与 node_modules 布局非常兼容,因为这将是避免长尾兼容性问题的最有可能的方法。

但是,您将无法利用 Yarn 生成的 Yarn.lock,因为(顾名思义)它仅受 Yarn 支持,而 npm shrinkwrap 不兼容。

另外,正如 @RyanZim 所指出的,旧版本的 Yarn 不支持 pre- and post-install hooks,但 versions later than v0.16.1 支持。如果您依赖这些挂钩,则需要向用户指定需要大于 v0.16.1 的版本。

总而言之,只要您没有遇到错误并且只使用两个包管理器共享的功能,您应该没有任何问题。

【讨论】:

应该添加 yarn 不支持 postinstall 脚本。对于大多数软件包来说,这不是问题,但有些软件包无法正确安装。 @RyanZim 它似乎已根据 GitHub 修复 - 你知道主版本中的更改是否已经完成吗? 不知道,我实际上并没有使用纱线。我认为 yarn 以安全为由反对postinstall 脚本。介意在此处发布指向 Github 上相关主题的链接吗? PR 是 here - 看起来他们改变了主意。如果你还没有安装 yarn,我会自己测试一下,并根据需要更新帖子。 @RyanZim 刚刚通过安装使用 node-gypbcrypt 包进行了测试 - 从 v0.16.1 开始可以正常工作。

以上是关于yarn 和 npm 在实践中可以互换吗?的主要内容,如果未能解决你的问题,请参考以下文章

“seekp”和“seekg”可以互换吗?

“seekp”和“seekg”可以互换吗?

CBitmap 和 CImage 可以互换吗?

stlinkv2和v3可以互换吗?

函数声明和函数表达式可以互换使用吗? [重复]

QuantLib 金融计算——案例之普通利率互换分析