关于
将大型代码仓库分割成多个独立版本化的 软件包(package)对于代码共享来说非常有用。但是,如果某些更改 跨越了多个代码仓库的话将变得很 麻烦 并且难以跟踪,并且, 跨越多个代码仓库的测试将迅速变得非常复杂。
为了解决这些(以及许多其它)问题,某些项目会将 代码仓库分割成多个软件包(package),并将每个软件包存放到独立的代码仓库中。但是,例如 Babel、 React、Angular、Ember、Meteor、Jest 等项目以及许多其他项目则是在 一个代码仓库中包含了多个软件包(package)并进行开发。
Lerna 是一种工具,针对 使用 git 和 npm 管理多软件包代码仓库的工作流程进行优化
入门
首先使用 npm 将 Lerna 安装到全局环境中:
推荐使用 Lerna 2.x 版本。
npm install --global lerna
接下来,我们将创建一个新的 git 代码仓库:
git init lerna-repo && cd lerna-repo
现在,我们将上述仓库转变为一个 Lerna 仓库:
lerna init
你的代码仓库目前应该是如下结构:
lerna-repo/
packages/
package.json
lerna.json
命令
以下是每个命令的简要介绍。 请访问 README 文件以获取更多详细信息。
lerna init
常见一个新的 lerna 仓库(repo)或将现有的仓库升级为适配当前 版本的 Lerna。
参数
--independent
/-i
– 使用独立的
版本控制模式。
lerna bootstrap
在当前 Lerna 仓库中执行引导流程(bootstrap)。安装所有 依赖项并链接任何交叉依赖。
此命令至关重要,因为它让你可以
在 require()
中直接通过软件包的名称进行加载,就好像此软件包已经存在于
你的 node_modules
目录下一样。
lerna import <pathToRepo>
将本地路径 <pathToRepo> 中的软件包导入(import) packages/<directory-name> 中并提交 commit。
lerna publish
为已经更新过的软件包创建一个新版本。提示 输入新版本号并更新 git 和 npm 上的所有软件包。
参数
--npm-tag [tagname]
— 使用给定的
npm dist-tag (默认为 latest)发布到 npm。
--canary
/-c
– 创建一个 canary 版本。
--skip-git
– 不要运行任何 git 命令。
--force-publish [packages]
— 强制发布
指定的一个或多个软件包(以逗号分隔)或使用
*
表示所有软件包(对于修改过的软件包跳过 git diff 检查)。
lerna changed
检查自上次发布以来哪些软件包被修改过。
lerna diff [package?]
列出所有或某个软件包自上次发布以来的修改情况。
lerna run [script]
在每一个包含 [script] 脚本的软件包中运行此 npm 脚本。
lerna ls
列出当前 Lerna 仓库中的所有公共软件包(public packages)。
Lerna 用户列表:
- primer/primer
- babel/babel
- facebook/create-react-app
- ReactTraining/react-router
- pugjs/pug
- facebook/jest
- reactotron/reactotron
- ElemeFE/mint-ui
- devtools-html/debugger.html
- alibaba/rax
- Turfjs/turf
- babel/babili
- storybooks/storybook
- xmppjs/xmpp.js
- wooorm/retext
- jumpsuit/jumpsuit
- strapi/strapi
- cloudflare/cf-ui
- colmena/colmena
- angus-c/just
- cerebral/cerebral
- nteract/nteract
- wooorm/remark
- rofrischmann/fela
- tbranyen/diffhtml
- ElemeFE/cooking
- antwarjs/antwar
- apollostack/graphql-server
- jimpick/lambda-comments
- lystable/recon
- marudor/flowInterfaces
- GoogleChrome/sw-helpers
- webpack-preset/webpack-preset
- vazco/uniforms
- metal/metal.js
- steelbrain/pundle
- neos/neos-ui
- mosjs/mos
- lore/lore
- act-framework/act
- yvele/poosh
- noderaider/gridiron
- superawesomelabs/leo
- tocco/tocco-client
- zalando-incubator/tessellate
- sencha/extjs-reactor
- DigitalRiver/react-atlas
- forivall/tacoscript
- Boxable/box-ui
- flux-capacitor/flux-capacitor
- trepo/trepo-js
- spacedoc/spacedoc
- oknosoft/metadata.js
- uber-web/uber-eslint
- brittanica/brittanica
- openzipkin/zipkin-js
- vudash/vudash
- nteract/commuter
- frintjs/frint
- fyndiq/fyndiq-ui
- azu/immutable-array-prototype
- TrueCar/gluestick
- KELiON/create-cerebro-plugin
- phenomic/phenomic
- sterjakovigor/vqua
- wireapp/wire-web-packages
- klis87/redux-saga-requests
- WordPress/gutenberg
- react-cosmos/react-cosmos
- jsbites/jedifocus-monorepo
- FoalTS/foal
- emotion-js/emotion
- Bamieh/reflow
- transloadit/uppy
- olistic/warriorjs
- gatsbyjs/gatsby
- feathersjs/feathers
- vuejs/vue-cli
- dvajs/dva
- umijs/umi
- SBoudrias/Inquirer.js
- pedronauck/docz
- tasitlabs/tasitsdk
- zeit/next.js
- react-bootstrap-table/react-bootstrap-table2
- webpack/webpack-cli
- reakit/reakit
- webdriverio/webdriverio
- graycoreio/daffodil
- typescript-eslint/typescript-eslint
- stoplightio/prism