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
。据我所知,无论哪种方式,所有软件包似乎都可以安装和工作。
yarn
和 npm
是否可以互换,从而成为一种可行的方法?还是有可能导致的潜在问题?我们是打算只选择一个,还是在实践中 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-gyp
的 bcrypt
包进行了测试 - 从 v0.16.1 开始可以正常工作。以上是关于yarn 和 npm 在实践中可以互换吗?的主要内容,如果未能解决你的问题,请参考以下文章