gpt4 book ai didi

yarnpkg - yarn --pnp 是什么?

转载 作者:行者123 更新时间:2023-12-03 17:40:50 29 4
gpt4 key购买 nike

有一个名为 Plug'n'Play 的 Shiny Yarn 新功能。

我想知道它究竟是做什么的?

我知道它正在创建一个 .pnp文件夹和 .pnp.js文件,但它是否会更改机器上的其他任何内容,例如某处的配置文件?

谢谢你。

最佳答案

我设计并实现了 PnP,所以我可以谈论几个小时 🙂

tl;博士:我们只写.pnp.js.pnp文件夹(在常规 Yarn 缓存之上)。我们不会在其他任何地方存储配置。

无需即插即用

当您运行时 yarn install (即使没有 PnP),也会发生一些事情:

  • 如果您使用 offline mirror功能,我们从注册表下载 tarball 并将它们存储在脱机镜像文件夹中
  • 无论您是否使用离线镜像,我们都会解压下载的所有 tarball 并将其文件存储在 Yarn 缓存中
  • 然后我们找出缓存中的哪些文件应该复制到 node_modules 中的哪个位置。
  • 我们应用计算的变化(基本上是一堆 rsync 操作)


  • 即插即用

    使用 PnP,工作流程变成这样:
  • 没有变化,我们从离线镜像中的注册表下载 tarball(如果启用)
  • 没有变化,我们仍然将它们解压到 Yarn 缓存中
  • 我们生成一个 .pnp.js文件¹

  • 就是这样。除了 .pnp.js 没有其他生成的文件文件(和缓存,但它之前已经存在了)。

    ¹ 正如您提到的,我们还生成了 .pnp项目中的文件夹( .yarn 从 Yarn 2 开始)。此文件夹旨在包含两种类型的数据:
  • 未插入的包是必须在项目本地的包。通常,这些是带有安装后脚本的包(我们无法将它们存储到缓存中,因为生成的工件可能因项目而异)。
  • 虚拟包,它们是为列出对等依赖项的依赖关系树中的每个包创建的符号链接(symbolic link)。无需赘述,它们是设计的必要部分,并且是制作require.resolve 所必需的。像以前一样工作。从 Yarn 2 开始,这些文件不再存在 🎉


  • 它是如何工作的?
    .pnp.js文件包含类似于以下内容的信息:
    webpack@1.0.0 -> /cache/webpack-1.0.0/
    -> it depends on lodash@1.0.0

    lodash@1.0.0 -> /cache/lodash-1.0.0/
    -> no dependencies

    通过拥有这些信息,分辨率可以正确推断出当 /cache/webpack-1.0.0 内的文件时要求调用 lodash ,则必须从 /cache/lodash-1.0.0 加载所需的文件.在实践中它有点复杂(我们保留一个逆映射以提高性能,我们使用相对路径来确保可移植性等),但一般概念就在那里。

    奖励回合:即插即用 + Zip 加载(Yarn 2)

    奖金:使用 Yarn 2,我们将进一步改进此工作流程。这是它的样子:
  • 我们从注册表下载 tarball 并将其存储到缓存中(离线镜像和缓存之间没有更多区别 - 它们是相同的)
  • 我们生成相同的 .pnp.js文件和以前一样

  • 就是这样!如您所见,我们不再解压缩包(相反,我们使用 Node 加载器在运行时从包存档中读取它们)。

    这样做有一个非常有趣的特性:如果您的缓存和 .pnp.js文件在那里,你不需要运行 yarn install让您的应用程序正常工作!为了确保您拥有这些文件,您只需将它们添加到您的存储库中,并像处理其他所有内容一样对其进行版本控制。²

    它非常有用,因为您不需要记住运行 yarn install之后 git rebase , git pull , 或 git checkout ,并且您的 CI 系统变得更快、更稳定,因为它们不需要特殊设置 - 只需克隆您的应用程序,它就会正常工作。

    ² 在有人提到之前 - 在存储库中 checkin 二进制文件是 perfectly fine .原因 node_modules在你的存储库中 checkin 是一件非常糟糕的事情,因为文本文件的数量呈指数级增长,这给 Git 带来了巨大的压力——从技术上讲,在哲学上也是如此,因为代码审查变得不可能。

    在我描述的情况下,我们不会遇到同样的问题,因为文件数量受到限制(每个包只有一个文件),并且查看它们非常容易 - 事实上,最好是你可以清楚地看到如何PR 将许多新包添加到您的项目中!

    关于yarnpkg - yarn --pnp 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53135221/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com