# 前言
和大家一起学习探讨包管理策略,monorepo 和 multrepo 区别,Lerna 的基本操作和原理,Lerna 的适用场景,同时深入到 Lerna 源码探究它是如何实现 文件软链。
# Lerna开发环境源码
# Lerna 简介
A tool for managing JavaScript projects with multiple packages. Lerna is a tool that optimizes the workflow around managing multi-package repositories with git and npm.
翻译: Lerna 是一个用来优化托管在 git\npm 上的多 package 代码库的工作流的一个管理工具,可以让你在主项目下管理多个子项目,从而解决了多个包互相依赖,且发布时需要手动维护多个包的问题。
关键字: 多仓库管理,多包管理,自动管理包依赖
# 通过本章读者可以学习了解到什么?
- lerna 基本操作,如何更新,链接,发布等。
- lerna 采用的是 monorepo 模式,和 multrepo 有什么区别。
- lerna 是如何实现内部文件软链,是 npm link 么。
- lerna 的适用场景以及包管理策略。
- lerna 如何提升安装性能。
- lerna 如何指定发布版本,如何指定发布子目录
# lerna的使用策略

我们一般会把一个大型项目才分两大部分:业务模块 + 通用模块。 由于通用模块会被多个业务模块使用,往往是通过 NPM 包提供服务。lerna 很好的管理多个包以及他们的依赖关系。
最佳案例:React 仓库, Rax 仓库
# Lerna核心原理
# monorepo 和 multrepo 区别
monorepo: 是将所有的模块统一的放在一个主干分支之中管理。
multrepo: 将项目分化成为多个模块,并针对每一个模块单独的开辟一个reporsitory来进行管理。

# lerna 如何实现软链
lerna 是如何做到内部模块的软链和管理,对于作者来说是一个很大的困惑?在 npm 下,npm link 可以在系统目录下建立包软链。软链可以不需要发布,就可以使用本地包,很好的提高开发效率。
作者阅读源码发现 lerna 实现软链使用了 symlink-dependencies 包。最终使用 fs.symlink 函数实现了文件软链。

源码解析如下:
- command 基类是 lerna 的核心包,提供了各种指令
- utils 目录下提供了文件软链的各种方法,例如:create-symlink(创建软链),symlink-dependencies(软链依赖)等
- 在 create-symlink 文件中, 核心函数
createSymbolicLink使用了fs文件类的symlink方法实现了文件依赖管理
createSymbolicLink 函数源码地址
# Lerna 环境配置
# lerna 初始化
npm i lerna -g // 全局安装lerna
lerna init // 初始化lerna目录
