跳至主要内容

贡献

感谢您的参与!Yarn 非常重视成为一个社区项目,我们依赖您的帮助,就像您依赖我们的帮助一样。为了帮助您帮助我们,我们投入了基础设施和文档,这些内容可以让您非常轻松地为 Yarn 做出贡献。如果您对我们如何改进有任何反馈,请提出问题进行讨论!

提出问题

问题必须遵循问题模板。请务必遵循所有内容,尤其注意重现。如果我们无法重现您的问题,我们将无法解决它。

您如何提供帮助?

  • 查看我们的文档!我们通常不是英语母语人士,我们的语法可能有点不准确。我们非常感谢任何可以帮助我们让文档更易于理解的帮助!

  • 在您当地的聚会上讨论 Yarn!即使是我们的用户也不总是了解我们的某些功能。学习,然后与您自己的圈子分享您的知识!

  • 帮助我们的基础设施!总有一些小的改进要做:更快地运行测试、统一测试名称、改进版本号的设置方式,...

  • 编写代码!我们有许多想要实现的功能,但实际完成它们的时间却很少……我们欢迎您提供的任何帮助,您也会满意地知道您的工作确实帮助了数百万开发人员!

查找待完成的工作

在新的代码库中,您可能很难知道从哪里开始。为了对此提供一些帮助,我们尝试使用标签标记各种问题,以突出显示我们认为不需要像其他问题那样多背景信息的问题

  • Good First Issue 通常是范围有限的独立功能,是深入了解 Yarn 底层工作原理的好方法。

  • Help Wanted 是不需要太多背景信息的问题,但影响力也比需要背景信息的问题小,因此没有核心维护人员有带宽来处理它们。

最后,请随时进入我们的 Discord 频道 寻求帮助和指导。我们始终乐于看到新鲜血液,并将尽力帮助您成功做出您的第一个开源贡献!

编写您的功能

我们的存储库设置方式如下:在其中调用 yarn 将始终使用 TypeScript 源本身 - 您不必重新构建任何内容即可在那里应用您的更改(我们使用 esbuild 在需要时自动转换文件)。缺点是它比常规 Yarn 慢,但改进的开发人员体验非常值得。

yarn install # Will automatically pick up any changes you made to sources

测试您的代码

我们目前有两个测试套件,用于不同的目的。第一个是单元测试,可以通过从存储库中的任何位置运行以下命令来触发

yarn test:unit

虽然通过单元测试测试了具有严格 JS 接口契约的各种子组件(例如便携式 shell 库或我们提供的各种 util 库),但 Yarn 作为一个整体依赖于集成测试。由于与我们的用户体验非常接近,因此在重构应用程序时,它们让我们更有信心,认为一切都将按计划进行。可以通过运行以下命令(同样,从存储库中的任何位置)来触发这些测试

yarn build:cli
yarn test:integration

请注意,由于我们希望避免在每次 Yarn 调用中添加 esbuild 开销,因此需要预构建 CLI 才能运行集成测试 - 这就是 yarn build:cli 命令的用途。不幸的是,这意味着如果您希望集成测试能够获取您的更改,则需要在每次修改后重新构建 CLI。

单元测试和集成测试都使用 Jest,这意味着您可以使用 -t 标志(或仅使用文件路径)来筛选您想要运行的测试

yarn test:unit yarnpkg-shell
yarn test:integration -t 'it should correctly install a single dependency that contains no sub-dependencies'

如果您需要编写测试(如果您添加功能或修复错误,您肯定会编写 😉),它们位于以下目录中

makeTemporaryEnv 实用程序仅为您的测试上下文生成一个非常基本的临时环境。第一个参数将用于生成 package.json 文件,第二个参数将用于生成 .yarnrc.yml 文件,第三个参数是在创建临时环境后将运行的回调。

格式化您的代码

在提交代码以供审查之前,请务必使用存储库中任何位置的以下命令正确格式化代码

yarn test:lint

我们使用 ESLint 检查此内容,因此使用 --fix 标志将导致 ESLint 尝试自动更正代码中可能遗留的大多数错误

yarn test:lint --fix

检查约束

我们使用 约束 在整个存储库中强制执行各种规则。它们在 constraints.pro 文件 中声明,其用途通过注释记录。

可以使用 yarn constraints 检查约束,并使用 yarn constraints --fix 修复约束。一般来说

  • 工作区不得依赖于依赖项的冲突范围。在安装依赖项时使用 -i,--interactive 标志并选择“重用”,则无需处理此规则。

  • 工作区不得依赖于可用工作区的非工作区范围。在安装依赖项时使用 -i,--interactive 标志并选择“重用”或“附加”,则无需处理此规则。

  • 作为标准包或插件一部分的工作区必须具有特定的构建脚本。那些不是的,必须使用 inline_compileconstraints.pro 文件中声明。

  • 工作区必须通过 repository 字段指向我们的存储库。

准备要发布的 PR

为了追踪需要发布的包,我们使用 以下文档 中描述的工作流。总结来说,你必须在每次创建的 PR 上运行 yarn version check --interactive,并选择哪些包应该再次发布以使你的更改生效(如果有的话),以及发布到哪个版本。

你可以使用 yarn version check 检查是否已正确设置所有内容。

如果你希望某个包必须再次发布,但 Yarn 没有为你提供此选项,请首先检查本地分支的名称是否为 master。如果是这种情况,Yarn 可能无法检测到你的更改(因为它将针对 master 进行检测,而 master 就是你自己)。运行以下命令

git checkout -b my-feature
git checkout -
git reset --hard upstream/master
git checkout -
yarn version check --interactive

如果失败并且你不知道原因,请随时 ping 一个维护者,我们会尽力帮助你。

注意:如果你修改了其中一个 默认插件,你还需要升级 @yarnpkg/cli

审阅其他 PR

如果您发现明显的错误,欢迎您留下评论,但如果您不是成员,请不要批准公关。在开源社区中,这通常被视为不良形式

编写文档

我们使用Docusaurusmdx源文件生成 HTML 页面。

我们的网站存储在packages/docusaurus目录中。您可以通过修改docs文件夹中相应的.mdx文件来更改页面。例如,您将编辑此页面此处

然后运行以下命令以生成本地服务器并查看您的更改

yarn start

一旦您对文档的外观感到满意,只需提交您的本地更改并打开公关。Netlify 将获取您的更改并为每个人创建一个新的预览

分析

运行以下命令以生成未压缩的包

yarn build:cli --no-minify

packages/yarnpkg-cli/bundles/yarn.js处对生成的包使用分析器。以下是一个使用 Node.js 内置分析器的示例

YARN_IGNORE_PATH=1 node --prof packages/yarnpkg-cli/bundles/yarn.js