最近发现公司一个项目的目录组织挺奇怪的,全部的子项目都放在了packages
目录里,还有这种骚操做?特地查了下资料,发现是一种比较流行的monorepo
项目管理模式。近几年比较火的React,Vue,Babel都是用的这种模式:javascript
咱们日常通常采用的都是multiple repositories
的项目管理模式:把一个大项目拆分红若干个小项目,每一个小项目都独立的放在gitlab上。这种模式其实也没啥很差,可是某些状况下,子项目A依赖子项目B,若是子项目B常常改动,那么每次B改动了,都要修改A,这时就很是麻烦。在开发一个前端框架或者UI库时,就常常会遇到上述状况,这时咱们就能够考虑下monorepo
。前端
monorepo
说到底也只是一个理念,那么怎么才能实现这种代码组织呢?java
本文主要介绍下lerna的使用node
源码参考ios
全局安装lernagit
npm i lerna -g
复制代码
lerna是基于git的,在github上新建一个项目learn-lerna
github
git clone git@github.com:deepred5/learn-lerna.git
cd learn-lerna
复制代码
初始化项目:npm
lerna init
复制代码
lerna会自动建立一个packages
目录夹,咱们之后的项目都新建在这里面。同时还会在根目录新建一个lerna.json
配置文件json
{
"packages": [
"packages/*"
],
"version": "0.0.0" // 共用的版本,由lerna管理
}
复制代码
咱们建立两个package:bootstrap
cd packages
mkdir prpr-lerna-core
cd prpr-lerna-core
npm init -y
复制代码
cd packages
mkdir prpr-lerna-popular
cd prpr-lerna-popular
npm init -y
复制代码
注意:这两个package咱们最后都是要发布到npm上的,因此名字请取特殊些,不能被人用过
prpr-lerna-popular
依赖prpr-lerna-core
,这时有两种方法添加依赖:
第一种方法是修改prpr-lerna-popular/package.json
,添加
{
"dependencies": {
"prpr-lerna-core": "^1.0.0"
}
}
复制代码
而后运行lerna bootstrap
第二种方法是直接使用命令add
lerna add prpr-lerna-core --scope=prpr-lerna-popular
复制代码
运行以后,咱们发现prpr-lerna-popular
生成了node_modules
,而node_modules
里生成了指向prpr-lerna-core
的软链,相似npm link
的效果:
新建prpr-lerna-core/index.js
const API = 'https://yande.re/post/popular_recent.json';
module.exports = {
API
}
复制代码
prpr-lerna-popular
除了依赖prpr-lerna-core
,还能够依赖其余开源的库,好比咱们使用axios
lerna add axios --scope=prpr-lerna-popular
复制代码
新建prpr-lerna-popular/index.js
const { API } = require('prpr-lerna-core');
const axios = require('axios');
const getPopularImg = () => axios.get(API)
module.exports = getPopularImg;
// 测试代码,发布时删除
getPopularImg().then((res) => console.log(res.data.length));
复制代码
测试一下: node packages/prpr-lerna-popular/index.js
正常状况下能够输出结果
首先把全部的代码提交
cd learn-lerna
git add .
git commit -m "test publish"
复制代码
注册一个npmjs帐户
npm login
复制代码
登入你的帐户,若是本地npm是淘宝镜像,必定要换回https://registry.npmjs.org/
地址!!!
lerna publish
复制代码
运行publish
,选择发布的版本号
lerna能够帮咱们管理版本号,很是方便!
lerna init #初始化
lerna bootstrap #下载依赖包或者生成本地软链接
lerna add axios #全部包都添加axios
lerna add prpr-lerna-core --scope=prpr-lerna-popular #给包prpr-lerna-popularx添加prpr-lerna-core依赖
lerna list
lerna clean
复制代码
lerna默认使用的是集中版本,全部的package共用一个version。若是但愿不一样的package拥有本身的版本,可使用Independent模式
发布package的名字若是是以@
开头的,例如@deepred/core
,npm默认觉得是私人发布,须要使用npm publish --access public
发布。可是lerna publish
不支持该参数,解决方法参考: issues