在同一个项目中使用 NPM 和 Yarn 有啥坏处吗?

Posted

技术标签:

【中文标题】在同一个项目中使用 NPM 和 Yarn 有啥坏处吗?【英文标题】:Is there any harm in using NPM and Yarn in the same project?在同一个项目中使用 NPM 和 Yarn 有什么坏处吗? 【发布时间】:2018-09-10 09:13:42 【问题描述】:

我一直在将 npm 用于个人项目,最近偶然发现了 yarn。在我使用 npm 的同一个项目中切换到 yarn 的包管理器会有任何危害或“预期的副作用”吗?

【问题讨论】:

我两者都用,并且更喜欢纱线(为了速度),所以如果你不能混合和匹配命令npm install --save proj1然后稍后yarn add proj2那么我需要知道。我相信你可以混搭,但我肯定遇到了问题(当其中一个抱怨时),我删除了 node_modules 目录并重建它以解决问题。我知道锁定文件是不同的。好问题! 在我的项目中,我同时使用了 npm 和 yarn。例如,其中一个模块没有用 npm 正确安装,所以我使用 yarn 来安装那个模块。对于许多其他人,我使用了 npm。都在同一个项目中。到目前为止没有问题.. 【参考方案1】:

虽然这里的一些评论者说在同一个项目中混合使用 yarn 和 npm 是可以的,但是在使用 yarn 和 npm 然后再次使用 yarn 之后,这就是 yarn 不得不说的:

warning package-lock.json found. Your project contains lock files generated by tools
other than Yarn. It is advised not to mix package managers in order to avoid resolution 
inconsistencies caused by unsynchronized lock files. To clear this warning, remove
package-lock.json.

【讨论】:

对我也一样。 但我是否也应该删除node_modules 并重新安装所有带有yarn install 的软件包? 太糟糕了,它只是一个警告,而不是一个句号。有些开发人员一直忘记我们使用npm 并不断将yarn.lock 推送到存储库中。【参考方案2】:

因为对我来说,将它们用于一个项目并没有什么坏处。

我在开发环境中使用 npm 和 yarn (50/50)。 但在 ci/di 上,我只使用 yarn,因为它更快,而且我减少了构建时间,这要归功于 yarn。

而且它们都创建不同的 .lock 文件名。

【讨论】:

感谢大家的帮助! 在 ci 上也可以使用 $ npm ci 命令;由于 npm 附带节点,因此将 npm 用于 ci 可能更容易。 blog.npmjs.org/post/171556855892/…【参考方案3】:

在这里https://classic.yarnpkg.com/en/docs/migrating-from-npm/我们可能会发现Yarn的解析算法与NPM解析算法兼容的确认。

在 npm 项目(带有 package.json)中,如果您运行 yarn,它将读取您的 node_modules 文件夹(使用解析算法)并使用您项目的锁定依赖树创建一个 yarn.lock 文件。

基于此,我假设它们在同一个项目中是兼容的。

2021 年 4 月 30 日更新

我最初的回复指的是yarn 1 (classic),尽管我刚刚使用create-react-app 工具创建了一个React 应用程序,并且默认情况下它使用package.json + yarn.lock 创建了项目的存储库。再次证明它没问题(即使 Dave Pile 提到了警告)。

归根结底,这是一个既要工作又要检查自己的问题...

【讨论】:

【参考方案4】:

没有人告诉过锁定文件。

假设您在开发环境中使用 yarn,在构建/生产服务器上使用 yarn。当您使用 yarn 安装一个包,并且您的项目在您的计算机上运行时,您可能希望让它在生产环境(您的服务器)上运行。

很遗憾,当项目在您的计算机上运行时,您会提交 yarn.lock 文件,该文件会“保存”您拥有的每个包的确切版本。

在您的构建/生产服务器上,您应该调用yarn install,但要求使用--frozen-lockfile 参数保持所有相同的版本。甚至有人说"yarn install --frozen-lockfile should be the default behavior",我同意。

然后...在您正在工作的项目中进行另一个开发人员跳转,并使用npmyarn 除外)安装一个包。该新软件包不会包含在您的 yarn.lock 文件中,但会创建一个新的 package-json.lock 文件,告知它正在使用的确切软件包版本。

当该提交到达您的构建/生产服务器时,它将崩溃,失败,因为yarn.lock 文件中不存在该新包。有人需要拉取这些更改,调用yarn 来安装依赖项并使用新的包依赖项更新锁定文件,然后再次将其推送到存储库。


关于是否使用锁定文件的简要说明。如果您在机器上最后一次安装几周后在构建/生产服务器上调用“纱线安装”,那么服务器将有许多其他新版本,而不是您最后的“稳定”版本。我已经发生过很多次了。

我最近发布了package-locks-checks,它有助于确保您不仅拥有一个锁定文件,而且还锁定了项目中的每个包版本。

【讨论】:

重要!!!阅读上面的答案!总之,如果您同时使用这两个词...您将无法托管您的网站。我已经尝试过netlifyHeroku,他们给了我同样的警告,然后由于警告而部署失败。他们说要删除package-lock.json 文件,然后如果我这样做了,然后再试一次,他们说上面的文件丢失了,但是你与npm 有依赖关系......现在怎么办? :( 嗨,有没有办法检查哪些软件包与yarn 并卸载它们并与npm 安装它们?我什么也找不到。我尝试了yarn checknpm ls,但它们都产生了错误。或者有没有其他的解决方案。谢谢

以上是关于在同一个项目中使用 NPM 和 Yarn 有啥坏处吗?的主要内容,如果未能解决你的问题,请参考以下文章

何时在 NPM 上使用 Yarn?有啥区别?

brew、yarn 和 npm 有啥区别?

yarn.lock 和 npm 的 shrinkwrap 有啥区别?

yarn run 和 npm start 有啥区别?

`yarn link` 和 `npm link` 有啥区别?

“yarn build”命令有啥作用? “npm build”和“yarn build”是相似的命令吗?