简介最近在工作中要接触相关的东西,开始熟悉文档,并做好相关的翻译记录,以备日后参考。基于Lerna版本:v3.22.1。Lerna是一个用于管理包含多个包的JavaScript项目的工具。OriginMyGitHub是关于将大型代码库分离成独立版本的包,这对于代码共享非常有用。但是,跨多个存储库进行更改可能会变得混乱且难以跟踪,并且跨存储库进行测试会很快变得复杂。为了解决这些(以及许多其他)问题,一些项目会将其代码库组织到多个包存储库(有时称为monorepos)中。在开发Babel、React、Angular、Ember、Meteor、Jest等项目时,所有包都在一个存储库下开发。Lerna是一个简化使用git和npm管理多包存储库的工作流程的工具。Lerna还可以减少开发和构建环境中许多包副本所需的时间和空间,在这些环境中,一个项目的下载通常被分成许多独立的NPM包。有关详细信息,请参阅吊机文档。Lerna库是什么样子的?其实没什么。一个看起来像这样的文件系统:my-lerna-repo/package.jsonpackages/package-1/package.jsonpackage-2/package.jsonLerna能做什么?Lerna的两个基本命令是:lernabootstrap和lernapublish。Bootstrap将链接库中的依赖项。publish将发布任何更新的包。勒纳不能做什么?Lerna不是serverlessmonorepos的部署工具。提升可能与传统的无服务器monorepos部署技术不兼容。下面的介绍适用于3.x版本的Lerna。对于新项目,我们建议使用此版本而不是2.x。让我们首先通过npm安装Lerna作为项目的开发依赖项。$mkdirlerna-repo&&cd$_$npxlernainit这将创建一个lerna.json配置文件和一个包文件夹,因此您的文件夹现在应该如下所示:lerna-repo/packages/package。jsonlerna.json的工作原理Lerna允许您以两种模式之一管理项目:固定模式或独立模式。Fixed/Lockedmode(default)Lerna项目在Fixed模式下,它的操作在一个版本行上。此版本存储在项目根目录下的lerna.json文件的版本属性中。当你运行lernapublish时,如果一个模块自上次发布以来已经更新,它将更新到你发布的新版本。这意味着仅在您需要时才发布新版本的软件包。注意:如果您的主要版本为0(例如0.y.z),则所有更新都被视为中断。因此,以0的主要版本运行lernapublish并选择任何非预发布版本号将导致所有包发布新版本,即使自上次发布以来并非所有包都发生了变化。这是Babel目前使用的模式。如果您想自动将所有包版本组合在一起,请使用此模式。这种模式的一个问题是,对任何包的重大更改都会导致所有包都有相应的新版本。独立模式lernainit--independent独立模式下的Lerna项目允许维护者升级每个包的各自版本。每次发布时,系统都会提示您针对每个更改的包指定它是补丁、次要、主要还是自定义更改。独立模式允许您专门更新每个包的版本,这对一组组件很有用。这种模式结合语义释放之类的东西会省去很多麻烦。(atlassian/lerna-semantic-release已经这样做了)。以独立模式运行时,需要将lerna.json文件中version字段的值设置为independent。已解决的问题如果您在使用Lerna时遇到任何问题,请查看此文档,它可能有您正在寻找的答案。有关常见问题,请参阅FAQ.md。概念当Lerna运行并触发错误时,它会生成一个lerna-debug.log文件(与npm-debug.log文件相同)。Lerna还支持作用域包。运行lerna--help查看所有可用的命令和选项。lerna.json{"version":"1.1.3","npmClient":"npm","command":{"publish":{"ignoreChanges":["ignored-file","*.md"]},"bootstrap":{"ignore":"component-*","npmClientArgs":["--no-package-lock"]}},"packages":["packages/*"]}version:当前库的版本。npmClient:用于指定要在其上运行命令的特定客户端的选项(也可以在每个命令的基础上指定)。如果您想使用yarn运行所有命令,请将此值更改为“yarn”。默认为“npm”。command.publish.ignoreChanges:全局数组,指定文件的更改不会包含在lernachanged/publish中。这是为了防止一些不必要的修改被发布,比如修改README.md。command.publish.message:发布版本时的自定义提交消息。有关详细信息,请参阅@lerna/version。command.publish.registry:使用此设置自动发布源。如果需要身份验证,则必须先进行身份验证。command.bootstrap.ignore:全局数组,其中指定的内容在运行lernabootstrap命令时不会被关联。command.bootstrap.npmClientArgs:在运行lernabootstrap命令时直接传递给npminstall命令的全局参数数组。command.bootstrap.scope:一个全局数组,用于限制在运行lernabootstrap命令时将引导哪些包。包:用作包的全局位置数组。lerna.json中的包配置是与包含package.json文件的目录匹配的全局变量列表,这是lerna组织“叶”包的方式(与管理整个库的“根”package.json相反开发依赖和脚本)。默认情况下,lerna初始化包列表是["packages/*"],但你也可以使用其他目录,例如["modules/*"],或["package1","package2"]。全局是相对于lerna.json文件所在的目录定义的,通常是库的根目录。唯一的限制是您不能直接嵌套包位置,这也是“标准”npm包共有的限制。例如,["packages/*","src/**"]匹配这个树结构:packages/├──foo-pkg│└──package.json├──bar-pkg│└──package.json├──baz-pkg│└──package.json└──qux-pkg└──package.jsonsrc/├──admin│├──my-app││└──package.json│├──东西││└──package.json│└──things│└──package.json├──profile│└──more-things│└──package.json├──property│├──more-stuff││└──package.json│└──other-things│└──package.json└──上传└──other-stuff└──package.json被认为最好将叶包放在packages/*下的做法,但不是使用Lerna的要求。lerna.json中的一些字段不再支持,包括:lerna:之前用于指定Lerna的当前版本,在V3中已被弃用和删除。常见的devDependencies大多数devDependencies可以通过lernalinkconvert放入Lerna存储库的根目录中。上面的命令将自动提升并使用文件:说明符。Boosting有以下好处:所有包都使用相同版本的所提供的依赖项。可以使用GreenKeeper等自动化工具使根依赖项保持最新。安装依赖项的时间已减少。减少占用的存储空间。请注意,提供npm脚本使用的“二进制”可执行文件的devDependencies仍然需要直接安装在使用它们的每个包中。例如nsp是执行lernarunnsp时必需的依赖项。{"scripts":{"nsp":"nsp"},"devDependencies":{"nsp":"^2.3.3"}}Git升级依赖Lerna可以通过committish在git远程url上传递(例如#v1.0.0或#semver:^1.0.0)来指定本地依赖的版本而不是通常的版本号范围。当包必须是私有的并且不需要私有npm注册表时,允许通过Git存储库分发包。(有关实现细节,请参阅此注释)请注意,Lerna实际上并未将git历史拆分为单独的只读存储库。这是用户的责任。//packages/pkg-1/package.json{name:"pkg-1",version:"1.0.0",dependencies:{"pkg-2":"github:example-user/pkg-2#v1.0.0"}}//packages/pkg-2/package.json{name:"pkg-2",version:"1.0.0"}在上面的例子中:lernabootstrap命令会正确地将pkg-2链接到pkg-1.当pkg-2更改时,lernapublish命令会将committish(#v1.0.0)更新为pkg-1。使用Lerna的README徽章?添加READMEBadge以显示它:[](https://lerna.js.org/)向导如果您更喜欢命令行引导,您可能会喜欢lerna-wizard。它将指导您完成一系列定义明确的步骤:参考lernagithub
