Node脚本快速同步CNPM项目内用到的依赖

2022-03-08 15:05:36 浏览数 (1)

前言

还是为了解决之前的问题; 公司用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('


	

0 人点赞