这二者都是管理组织代码的方式,顾名思义 monorepo 就是把全部的相关项目都放在一个仓库中(好比 React, Angular, Babel, Google...),multirepo 则是按模块分为多个仓库。
参考:REPO 风格之争:MONO VS MULTInode
工做空间是一种新的方式来设置您的包体系结构,默认状况下能够从Yarn 1.0开始。它容许您以这种方式设置多个软件包,只须要运行yarn install一次便可将全部软件包安装在一个通道中。git
你为何想作这个?github
如何使用它? npm
在package.json
文件中添加如下内容。从如今开始,咱们将这个目录称为“workspace root”
:json
# package.json: { "private": true, "workspaces": [ "workspace-a", "workspace-b" ] }
请注意,private: true是必需的!工做区并不意味着要发布,因此咱们增长了这个安全措施,以确保没有任何东西能够意外暴露它们。bootstrap
在建立此文件后,建立两个名为workspace-a和workspace-b的新子文件夹。在其中的每一个文件中,使用如下内容建立另外一个package.json文件:安全
# workspace-a/package.json: { "name": "workspace-a", "version": "1.0.0", "dependencies": { "cross-env": "5.0.5" } }
# workspace-b/package.json: { "name": "workspace-b", "version": "1.0.0", "dependencies": { "cross-env": "5.0.5", "workspace-a": "1.0.0" } }
最后,在某个地方运行yarn install,最好在工做区的根目录下运行。若是一切正常,你如今应该有一个相似的文件层次结构:app
/package.json /yarn.lock /node_modules /node_modules/cross-env /node_modules/workspace-a -> /workspace-a /workspace-a/package.json /workspace-b/package.json
如今须要workspace-a位于workspace-b的文,件你的项目中将使用当前位于项目中的确切代码,而不是在Github上发布的代码,而且cross-env包已被正确地删除并放在项目的根目录下,以供二者workspace-a和workspace-b使用。less
Yarn 的工做区是诸如 Lerna 这样的工具能够(而且正在)利用的底层机制。 它们将永远不会试图提供像 Lerna 那么高级的功能,但经过实现该解决方案的核心逻辑和 Yarn 内部的链接步骤,咱们但愿可以提供新的用法并提升性能。工具
参考:
Lerna 它是基于 Monorepo 理念在工具端的实现。
Lerna是一种工具,能够优化使用git和npm管理多包存储库的工做流程。
详见:官方文档
// 全局安装 $ npm install -g lerna
Document:leran init
Usage:
$ lerna init --independent $ lerna init --exact(默认)
Demo:
$ mkdir lerna-repo && cd $_ $ lerna init
这将会建立一份lerna.json配置文件和一个packages文件夹,目录结构以下:
lerna-repo/ packages/ package.json lerna.json
Document:leran create
Usage:
$ lerna create <name> [loc]
Demo:
$ lerna create package-a packages
而后会在packages下多出一个package-a文件夹:
packages/ package-a/ __test__/ lib/ package.json README.md
能够单独对package-a模块进行管理。
Document:lerna add
Usage:
$ lerna add <package>[@version] [--dev] [--exact] [--peer]
Demo:
# Install module-1 to module-2 $ lerna add module-1 --scope=module-2
Document:lerna publish
Document:lerna bootstrap
Usage:
$ lerna bootstrap
When run, this command will:
npm install
all external dependencies of each package.packages
that are dependencies of each other.npm run prepublish
in all bootstrapped packages (unless --ignore-prepublish
is passed).npm run prepare
in all bootstrapped packages.lerna容许你使用两种模式来管理你的项目:Fixed or Independent
// lerna.json { ... "version":"0.0.0" }
Fixed mode 下在lerna.json文件里会有一个version:版本号
的内容。当你运行lerna publish
的时候, 若是packages的一个模块和上次发布版本内容比较有过更新,version字段就会更新,也就是说你发布了一个新版本。
使用这个模式会一块儿更新packages下全部的package,即便有的package没有更新过内容。这种模式下全部的package的版本都会保持一致。
执行命令:
lerna init --independent
// lerna.json { ... "version":"independent" }
Independent mode 容许你独立维护每一个package的版本。每次发布时,都会提示您已更改的每一个软件包,你能够指定此次修改是补丁,次要版本,主要版本,或者本身自定义版本号。