前言
还是为了解决之前的问题; 公司用CNPM作为内部私有仓,没有开启全量实时同步; 所以有些包会相对落后,所以常用同步上游就显得很重要了; 我想了想,每次都要手动去执行个别的包或者少量包的查询,操作太多了; 原理还是遵循CNPM更新机制,可以看看上篇帖子哈~
考虑的点
- 设置一个根路径,会自动检索下所有项目的packaeg.json(不包含node_modules)
- 包括所有git subtree或者monorepo的package.json
- 支持延时执行,一瞬间太多要同步的,会把内部搭建cnpm搞崩;
- 同步过,再下一个执行同步的会自动过滤.也就是同步过同名包不会再发同步请求
使用成本极低,一个Node环境装几个常用的npm包;
环境
- Node 14.16.1
效果图
源码
代码语言:javascript复制const globby = require('globby');
const fs = require('fs');
const path = require('path');
const axios = require('axios');
const chalk = require('chalk');
const isPlainObject = require('lodash/isPlainObject');
const options = {
baseRootPath: '/Users/linqunhe/Code/ONES', // 检索的根路径
ignorePackage: ['@ones-ai', '@ones'], // 忽略的包名,就是不管有木有缓存都不同步
delayTime: 10, // 每一次执行延时的时间,随着执行次数会递增 , 2000 = 2s
maxRetry: 3, // 整个逻辑,中间有错误重试机制最大次数
privateHostName: 'xxxxx', // 内网部署CNPM的访问域名
}
let cachePkgList = [];
let retryCount = 0;
const baseDep = ['npm', 'pnpm', 'yarn','recoil','typescript','mobx','mobx-react','react','redux','vite'];
function onesNpmSyncUpdate(pkgList, isArray = false) {
const syncReq = (pkgName) => {
return axios.put(`${options.privateHostName}/sync/${pkgName}?sync_upstream=true`).then(res => {
if (res && res.data && res.data.ok) {
const data = [
{
'执行时间': new Date().toISOString(),
'NPM包名': pkgName,
'同步状态': res.data.ok
}
]
console.dir(data);
}
}).catch(err => {
if (err) console.log('