Monorepo与Multirepo
这两者都是管理组织代码的方式,顾名思义 monorepo 就是把所有的相关项目都放在一个仓库中(比如 React, Angular, Babel, Google...),multirepo 则是按模块分为多个仓库。
参考:REPO 风格之争:MONO VS MULTI
Yarn Workspace
使用介绍
工作空间是一种新的方式来设置您的包体系结构,默认情况下可以从Yarn 1.0开始。它允许您以这种方式设置多个软件包,只需要运行yarn install一次即可将所有软件包安装在一个通道中。
你为什么想做这个?
- 依赖关系可以链接在一起,这意味着工作区可以相互依赖,同时始终使用最新的可用代码。这也是一个相对于yarn link更好的机制,因为它只影响你的工作空间树,而不是整个系统。
- 所有的项目依赖关系都将被安装在一起,为Yarn提供更多的自由度来更好地优化它们。
- 对于每个项目,Yarn将使用一个单独的锁文件而不是为每个工程使用一个不同的锁文件,这意味着更少的冲突和更容易的审查。
如何使用它?
在package.json
文件中添加以下内容。从现在开始,我们将这个目录称为“workspace root”
:
# package.json:
{
"private": true,
"workspaces": [
"workspace-a",
"workspace-b"
]
}
请注意,private: true是必需的!工作区并不意味着要发布,所以我们增加了这个安全措施,以确保没有任何东西可以意外暴露它们。
在创建此文件后,创建两个名为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,最好在工作区的根目录下运行。如果一切正常,你现在应该有一个类似的文件层次结构:
/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使用。
yarn workspace与lerna 的关系
Yarn 的工作区是诸如 Lerna 这样的工具可以(并且正在)利用的底层机制。 它们将永远不会试图提供像 Lerna 那么高级的功能,但通过实现该解决方案的核心逻辑和 Yarn 内部的连接步骤,我们希望能够提供新的用法并提高性能。
参考:
Lerna
Lerna 它是基于 Monorepo 理念在工具端的实现。
Lerna是一种工具,可以优化使用git和npm管理多包存储库的工作流程。
详见:官方文档
安装使用
// 全局安装
$ npm install -g lerna
初始化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
添加新的Module
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
发布Package
Document:lerna publish
安装项目所有依赖&&链接依赖
Document:lerna bootstrap
Usage:
$ lerna bootstrap
When run, this command will:
-
npm install
all external dependencies of each package. - Symlink together all Lerna
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 mode
lerna允许你使用两种模式来管理你的项目:Fixed or Independent
Fixed/Locked mode (default)
// lerna.json
{
...
"version":"0.0.0"
}
Fixed mode 下在lerna.json文件里会有一个version:版本号
的内容。当你运行lerna publish
的时候, 如果packages的一个模块和上次发布版本内容比较有过更新,version字段就会更新,也就是说你发布了一个新版本。
使用这个模式会一起更新packages下所有的package,即使有的package没有更新过内容。这种模式下所有的package的版本都会保持一致。
Independent mode
执行命令:
lerna init --independent
// lerna.json
{
...
"version":"independent"
}
Independent mode 允许你独立维护每个package的版本。每次发布时,都会提示您已更改的每个软件包,你可以指定这次修改是补丁,次要版本,主要版本,或者自己自定义版本号。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。