Yarn 现在接受赞助!请查看我们的 OpenCollective 和 GitHub 赞助商页面以了解更多详细信息。注意:可以通过从项目中的源代码运行 yarn set version 来试用 master 中的功能(现有的 contrib 插件会自动更新,而新的 contrib 插件可以通过运行 yarn plugin import from sources <name> 来添加)。 enableImmutableInstalls 现在在 CI 上默认为 true(我们仍然建议在 CLI 上显式使用 --immutable)。使用 PnP 时,Yarn 现在将生成 .pnp.cjs 文件(而不是 .pnp.js),无论清单中的类型字段设置为什么。删除了纱线工作区 foreach 的 -a 别名标志;使用 -A,--all 代替,这是完全相同的。 bstatePath 配置选项已被删除。构建状态 (.yarn/build-state.yml) 已移动到安装状态 (.yarn/install-state.gz) 缓存文件需要重新生成。我们不得不更改他们的时间戳,以解决 zip 规范中导致某些第三方工具出现问题的缺陷。
我们的 CLI 支持的 --clipanion=definitions 命令现在将公开入口点上的定义(而不是 .command 上的)工作区现在即使在节点模块链接器下也可以获得自引用(就像它已经与pnp 链接器)。这意味着名为 foo 的工作区现在可以安全地假设对 require('foo/package.json') 的调用将始终有效,在大多数情况下不需要绝对别名。节点模块链接器现在尽最大努力支持门户:协议。这种支持有两个重要的限制:使用此类依赖项的项目如果希望访问其依赖项,则必须使用 --preserve-symlinks 节点选项运行。由于安全原因 Yarn installs 永远不会修改项目外的文件,带有 portal: 的包的子依赖项必须被提升到门户之外。如果失败(例如,如果门户包依赖于与通过另一个包提升的版本不兼容的东西),链接器将产生错误并放弃安装。节点模块链接器现在可以使用硬链接。新设置 nmMode:经典 |硬链接本地| hardlinks-global 指定应该使用哪个 node_modules 策略:hardlinks-global - 标准 node_modules 布局,硬链接指向使用此选项的所有项目的全局内容存储
节点模块链接器现在将通过在需要时执行几轮来确保生成的安装布局是终端。当工作区依赖于列出安装脚本的另一个工作区时,节点模块链接器将不再打印有关安装后脚本的警告。节点模块链接器现在正确提升了依赖于它们自己的父节点的对等依赖项。当通过 ${ENV_VAR} 语法在配置文件中指定时,布尔值将被正确解释。 PnP 链接器现在计划在删除未插入文件夹的情况下重建包 新的 enableMessageNames 标志可以设置为 false 以从输出中排除 YNxxxx。 yarn init 现在甚至可以从现有项目中运行(将创建丢失的文件)。
除非设置了 --skip-plugins,否则源代码中的 yarn set 版本现在也将升级内置插件。 yarn version apply 现在支持一个新的 --prerelease 标志,它取代了以前处理预发布的方式。 yarn workspaces foreach --verbose 现在将在进程开始和结束时打印,即使它们没有输出。 yarn workspaces foreach 现在支持 --from <glob> 标志,当与 -R 结合使用时,将定位可从“from”glob 访问的工作区。 yarn patch-commit 现在可以在同一个补丁文件夹中多次使用。 yarn patch-commit 现在支持一个新的 -s,--save 标志,它将保存补丁而不是仅仅打印它。 yarn up 现在支持一个新的 -R,--recursive 标志,它将升级指定的包,无论它在哪里。
yarn config unset 是一个新命令,它将从本地配置中删除设置(如果设置了 -H,则为 home )。在 Yarn v1 项目中运行 yarn install 现在将自动启用节点模块链接器。这应该可以解决人们在迁移中遇到的大部分问题。我们仍然建议为新项目保留默认的 PnP,但选择权在您手中。现在以@yarnpkg/esbuild-plugin-pnp 的名称提供了一个官方的 ESBuild 解析器。我们用它来捆绑 Yarn 本身! PnP 项目现在可以使用节点导出字段 - 无论节点版本如何。 Prettier SDK 不再使用 PnPify,因为它是它唯一剩余的用途,并且具有相当的侵入性;因此,必须在 Prettier 的 plugins 配置属性中指定 Prettier 插件。无法应用的内置补丁将不再导致错误(它们会发出警告并使用原始来源)。请记住,补丁对我们的团队来说也是一个问题,我们这样做只是因为我们现在没有任何其他选项可供我们使用 - 如果您想提供帮助,请考虑对 TypeScript 存储库中的相关拉取请求进行投票,或者,如果您在 Microsoft 工作,也许可以向隔壁的 TypeScript 团队提及解决此问题对您有益。由于补丁冲突,无法安装 TypeScript 4.2 版本。现在已修复。此版本仅包含特定于 4.2 的修复,但从 3.0 开始的未来 Yarn 版本将更能容忍这种情况,不会导致此类错误。
重新实现了解析管道。我们之前使用多遍方法,在每次传递之间执行 SAT 优化,但经过调查发现 SAT 优化几乎没有影响并增加了性能瓶颈。我们现在使用更简单、更有效的算法运行分辨率。链接器现在可以定义自定义数据以在 Yarn 调用之间缓存。内置链接器 new 使用这些新功能来缓存不能在运行之间更改的包信息。在实践中,这会转化为更快的循环安装(当运行添加很少新包的安装时,如果有的话)。现在,当 packageExtensions 规则未使用或与原始包定义冗余时,会报告警告。可能会破坏,但它从一开始就是这样打算的:packageExtensions 字段不能再用于替换依赖项(只能添加缺少的依赖项)。更喜欢使用分辨率字段来替换现有字段。 upgrade-interactive 命令现在将只显示具有可用升级(而不是所有升级)的软件包的升级建议。 upgrade-interactive 命令已收到 UI 改进,应该更容易查看。 yarn workspaces focus 命令现在将只为聚焦的工作空间运行安装后脚本。
新的 yarn npm audit 命令可让您从 npm 注册表中查询审计信息。纱线工作区 foreach 命令有一个新标志 -R,--recursive,它将在当前工作区和它依赖的所有其他工作区上运行命令。 yarn install 上的新 --skip-builds 选项将让您跳过构建脚本而不影响生成的 Yarn 工件(与 enableScripts 相反,它也将停止拔出由于包含构建脚本而被拔出的包)。即使您的其他依赖项之一被报告为与您的系统不兼容,现在也可以在使用节点模块链接器时运行依赖项二进制文件。默认情况下,Windows 在生成任何文件名包含“install”、“setup”、“update”或“patch”(它认为它们是安装程序)的二进制文件之前会自动请求管理员权限。我们现在在 Windows 上使用的二进制跳线中明确选择退出此行为。默认情况下,传递给 MinGW 编译程序的参数由基本的 glob 模式引擎自动扩展。我们现在在 Windows 上使用的二进制跳线中明确选择退出此行为。您现在可以使用新的 logFilters 设置将警告转换为错误或信息,或完全隐藏它们。请注意,我们计划在下一个版本中显着改进对等依赖警告,因此即使您有一堆警告,也不要立即将它们静音。
一些 shell 错误(未找到匹配项、错误的文件描述符、未绑定变量、未绑定参数)现在将是可恢复的错误,使 shell 继续执行链中的下一个命令,而不是硬崩溃。修复 rm -rf ./inexistentFolder/* || 等情况真的。即使工作区不包含 zip 文件(通常是因为您排除了它们),扩展程序现在也会激活。即使导入的模块位于工作区深处,TypeScript 导入建议现在也应该是正确的。处于监视模式的 TypeScript(使用 -w 和在 VSCode 中)现在将在您添加新依赖项时检测它们。在 VSCode 中使用 ctrl+click 导入将不再带您到虚拟包(需要 SDK 更新)。在 node_modules 链接器中继承工作区对等依赖项时考虑对等依赖项默认值 yarn 标记命令集已从 Yarn Classic 移植为 yarn npm 标记。
运行 yarn info 现在将打印有关您的依赖项的许多信息。可以使用各种选项来调整输出,包括 --json。插件作者可以通过 fetchPackageInfo 钩子提供他们自己的信息部分。使用 -r,--reset 标志运行 yarn stage 现在将取消所有似乎与 Yarn 相关的更改。所有命令现在都记录了它们的每个选项(运行 yarn add -h 以查看示例)。发布注册表错误现在将按原样报告,而不是折叠为一般错误消息。现在将在 Windows 上使用本机二进制跳线来避免终止批处理作业 (Y/N)?调用依赖二进制文件时提示。以下更改仅适用于 pnp 链接器(这是默认安装策略): pnpapi 模块现在公开了一个名为 getAllLocators 的新函数,允许您访问地图中所有定位器的列表,而无需遍历依赖关系树。这个方法被认为是一个 Yarn 扩展,所以如果你打算在你的代码中使用它,你应该检查它是否存在。
当使用具有对等依赖关系的包的门户时,Yarn 会丢失解决这些对等依赖关系所需的信息。现在它将以与依赖树中的所有其他包相同的方式正确解析它们。 bin 符号链接现在将从 node_modules/.bin 文件夹中正确删除,因为它们的相应依赖项已被删除。出现了一个名为 nmHoistingLimits 的新设置。它取代了先前在 Yarn 1 中称为 nohoist 的东西。我们现在更加宽容那些对提升布局做出错误假设的包,首先尝试最大化顶层的包暴露。只有在填充了顶层之后,我们才会对剩余的包进行重复数据删除。修复了一些关于对等依赖的病态案例。特别是,工作区的对等依赖项现在将针对其最近的工作区祖先(根据目录层次结构)进行解析,而不是被忽略。请注意,在使用节点模块链接器时,工作区的对等依赖项存在固有问题,并且只能通过使用默认的即插即用链接器才能获得严格正确的行为。现在支持在安装中断后运行安装,并将导致一致的安装状态 yarn stage 命令现在允许在没有 -c,--commit 标志的情况下调用时暂存文件。
添加了一些内置扩展,以提高与未正确列出其依赖项的包的兼容性。包现在可以使用其清单中的 publishConfig.executableFiles 字段来指示一旦打包到存档中后哪些文件应保留可执行标志。这很重要,因为出于可移植性的原因,Yarn 在打包期间从所有文件中剥离了可执行标志(否则,在 Posix 和 Windows 上运行时,yarn 包会产生不同的输出)。 bin 字段中列出的文件默认假定为可执行文件,因此您无需在 executableFiles 中明确列出它们。即使没有通过 files 字段明确引用,yarn pack 也会正确包含 main/module/bin 文件。在某些日子使用新的 Windows 终端时,进度条的样式会正确。 Yarn 现在将避免使用依赖项的弃用版本,除非只有弃用版本可用于请求的范围。现在可以正确计算构建键,这解决了构建脚本在应该触发的时候并不总是被触发的问题。当纱线添加和纱线上升期间无法解决请求时,纱线现在将显示实际错误
yarn config set 现在支持 -H,--home 标志,这会导致它更新 home 配置而不是项目配置。当被较旧的 Yarn 版本使用时,在 home 配置文件中找到的设置不会导致异常。不支持的选项将被默默忽略。在使用配置有不同 Yarn 版本的多个项目时,这应该会改善用户体验。新的 immutablePaths 设置允许您指定在使用 --immutable 标志集运行 Yarn 时不得更改的路径。您可以使用它来检测对安装工件的意外更改,无论是 .pnp.js 还是 node_modules 文件。脚本现在可以使用 $RANDOM 变量以及在 $(()) 中使用 +、-、*、/ 和 () 的简单计算脚本现在可以使用分组花括号 ({echo foo}) 在上下文中执行命令的当前 shell(没有像 (echo foo) 那样创建子 shell)。现在,当需要来自无法立即访问它们的上下文的 Node 内置函数时(例如,从 Webpack 浏览器包中访问 fs 模块时),PnP 钩子将显示更清晰的错误消息。包现在可以使用清单中的新 "preferUnplugged": true 字段声明它们需要解包才能正常工作。这会损害用户的体验(您的项目将是唯一需要硬安装的项目),因此除非别无选择,否则请不要使用此字段。
运行 yarn search 将打开一个丰富的界面来搜索要安装的包(需要交互式工具插件)。从源代码运行 yarn plugin import 将允许您从我们存储库的主分支构建插件。运行 yarn workspaces focus 只会安装当前的工作空间,以及它可能依赖的任何其他工作空间。 --production 标志只会安装它们的生产依赖项。运行 yarn exec 将在当前工作空间的根目录执行指定的命令(从 Classic 分支重新引入)。 yarn init 现在将生成一个 EditorConfig 文件,并在生成的文件夹上运行 git init。 yarn init 现在支持 -i 标志,它会自动在项目中固定 Yarn 版本。 yarn init 现在将在生成初始清单时注入 initFields 配置设置中的设置(未来版本将删除现已弃用的 initVersion 和 initLicense 设置)。
纱线设置版本现在作为别名纱线策略设置版本(将在 3.x 中弃用)。 yarn run 现在支持二进制文件的 --inspect 和 --inspect-brk 开关(例如 yarn run --inspect-brk jest)。 yarn dlx 现在尊重本地项目配置(特别是配置的注册表)。这仍然是实验性的,将在接下来的几个月中进一步改进。当底层命令也返回退出代码时,yarn dlx 现在正确退出并带有退出代码。 yarn config get(和 set)现在可以访问嵌套的配置值(例如,yarn config get npmScopes.foo.npmRegistryServer 会告诉您为给定服务器配置了哪个服务器,如果有的话)。 yarn config get 现在将对世界其他地方隐藏它的秘密(或者你的秘密)。如果需要,新的 --no-redacted 选项将关闭此行为。 yarn config set 现在有一个 --json 选项,它会让 Yarn 知道它应该将给定的值解释为 JSON 对象(用于设置服务器配置等)。
如果出现错误,纱线工作区 foreach 现在将以预期的状态代码退出。注册表身份验证设置现在可以按范围声明(它们以前必须是每个注册表)。这对于 GitHub 包注册表模型会很方便,其中每个范围可能具有不同的访问令牌。配置文件现在使用 ${name} 语法(默认情况下严格;使用 ${name:-default} 提供默认值)使用环境变量插入值。新的 changesetIgnorePatterns 设置可用于忽略来自纱线版本检查的变更集检测中的某些路径(在决定哪些工作区需要新版本时,不会考虑对这些路径的更改)。新的 changesetBaseRef 设置可用于更改纱线版本检查将在其变更集启发式中使用的主分支的名称。新的 httpTimeout 和 httpRetry 设置允许您配置 HTTP(s) 请求的行为。新的 preferredTruncatedLines 设置允许您告诉 Yarn 如果信息和警告消息被截断以适合一行(错误将始终根据需要包装,并且管道 Yarn 的输出将完全关闭此行为)。
现在可以通过compressionLevel 配置缓存压缩级别。如果您不使用零安装,则使用 0 值可能会以很小的成本提高速度。 Git 协议现在可以从给定的存储库克隆任何工作区。为此,请使用 owner/repo#workspace=name 语法(您可以像往常一样将其与分支名称混合使用)。使用 Git 协议克隆的存储库现在将自动禁用 core.autocrlf,以便构建产生确定性的结果。一般来说,已经进行了改进,以避免新构建的包产生不同的结果。使用 Git 协议获取的包现在将使用 Yarn 1、Yarn 2、npm 或 pnpm 之一构建。将根据源的内容进行选择(例如,如果我们检测到 package-lock.json,我们将使用 npm pack 打包项目)。 exec: 协议具有不同的 API。特别是,现在可以访问内置模块而无需实际需要它们。文件外 PnP 数据生成已得到修复(它允许在与 JS 加载器本身分离的 JSON 文件中生成 PnP 数据)。虚拟实例重复数据删除中的一个边缘情况已得到修复;具有相同有效对等依赖项的包现在总是共享完全相同的实例。
我们用于在路径中定位 zip 文件的启发式方法已得到改进。因此,在我们的存储库上运行 ESLint 现在需要 28 秒而不是 57 秒。 Yarn 现在将从工作区检测中排除 node_modules 文件夹。因此,在您的工作区字段中列出 **/* 现在会将所有子包检测为工作区。为了使缓存内容寻址,缓存名称已更改。特别是,这意味着如果我们需要修复 fetch 步骤中的错误,我们将不再需要碰撞全局缓存键。 PnP 链接器现在具有额外的松散模式(可选,并通过 pnpMode:loose 设置启用)。在这种模式下,Yarn 将计算在 node_modules 链接下会被提升的包列表......