使用lerna管理复杂的js包依赖

最近在学习antd的项目生态,打算等大致脉络理清了就开始更点博客,顺带的开始照着antd的样子一点点的搭一个生态。antd的项目内部光集成环境就搞了多个,从文档的集中推送,到测试发包的持续集成,想学习做基础应用还是一个很好的项目。lerna是在内部的cli,bisheng上看到的。方案还是比较好的,虽然我们已经有一个package.json做包管理,但是这个所适应的环境普遍还是对于整个项目而言,如果要将包切割成多个包,其实包的管理问题就会出现了,因为版本信息就在哪里,你需要手动去更新相互依赖的版本信息。这个从现在一些开源的库来看就能看出一些信息来,做闭环的生态可控性要比开放式的要好,道理都懂就是太开放的东西,你在考虑自己的东西的时候还要兼顾考虑他人要做的这个一般不太能hold住的。所以如果要做一个闭环的生态系统,这样的一个集中式的管理工具会方便很多。

lerna

lerna的主要模式分为两个模式

Fixed/Locked mode

lerna init 初始化项目。

vue,babel都是用这种,在 publish 的时候,会在 lerna.json 文件里面 "version": "0.1.5", ,依据这个号,进行增加,只选择一次,其他有改动的包自动更新版本号。这个是一揽子操作,方便快捷,但是没有主要,次要,补丁之分。

Independent mode

lerna init --independent 初始化项目。

lerna.json 文件里面 "version": "independent",

每次 publish 时,您都将得到一个提示符,提示每个已更改的包,以指定是补丁、次要更改、主要更改还是自定义更改。

工作空间

默认是npm,当然可以切换成yarn使用 workspaces。两者的区别是前者不起用 workspaces的话,那么每个包都会有自己独立的node_modules,后者启用只有顶层会有。

create

创建一个包,如果loc的位置不指定一般就是默认在根目录下创建一个packages文件

lerna create [loc]

loc可选:包放置的文件夹位置

add

创建一个包,会自动加入到packages文件夹里

lerna add [@version] [--dev] [--exact] [--scope]

version可选: 指定版本信息

dev:和yarn与npm一样区分是开发依赖还是生产依赖

exact:指定精确的版本号

scope:安装一个包到指定的包下,eg:lerna add a --scope=b 安装a包到b包中

lerna bootstrap

安装所有的依赖到根目录下的node_modules

lerna list

列出当前在管理的包信息,这个一定是根据包内的package.json来获取的。因为如果你获取的信息和文件夹不一致,在没有列出的包里执行yarn init就好了。

lerna import

导入本地开发的包,指定包的详细文件夹地址就可以了。

lerna import /user/home/testpackages

lerna publish

发包操作,这个是git和npm同时进行。

后面的操作也相当简单。不过如果不打算做初具规模的包其实也不太会用到这些,把整个流程搞复杂了白白增添了一些工作损耗。

antd的部分构建流程

文档

两套,一套antd-tools推github.io,一套 netlify推 netlify。先推github然后 netlify和github共享一个分支。

发包

上面三套可以合并为一个,不过少了pubilsh操作都是容器内测试,如果把pubilsh加进去,好用点的可以选travis。测试完后自动推npm。

文档和包编译脚本

bisheng用来md文档转静态界面,antd-tools用来编译组件。bisheng和我现在看到的几个脚本里多了个好玩的东西,就是用了fork操作。居然用了多线程去搞md文档编译,也是antd的组件还蛮多的单个顺序去处理的话时间还是有点久。

boss主控调度,worker具体工作。传入task对象信息后,输出字符串信息然后转对象信息。

--- 题外餐 boss的这段操作 ---

1.初始的时候先获取电脑的cpus数,用来控制可同时处理的任务数量。

2.根据worker文件生成与cpus数同数量的工作线程。

3.如果当前的几个工作线程已经满了,就先把工作任务推到队列里,否则就立即执行任务。

4.然后就是while去轮询任务队列里是否有任务可以执行。

其实现在比较担心的是还从来没有学习一些比较复杂的多线程操作,它这个是这种模式。

从a直接分出了a1,a2,a3,a1,a2,a3都不需要依赖其他人结果的

真要做这种相互有依赖的还不知道怎么处理了,然后就会懵逼了。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章