贡献
感谢您的参与!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_compile
在constraints.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
如果您发现明显的错误,欢迎您留下评论,但如果您不是成员,请不要批准公关。在开源社区中,这通常被视为不良形式。
编写文档
我们使用Docusaurus从mdx源文件生成 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