如何解决公司内网Nexus npm仓库代理源同步不完整问题?

公司内网的nexus的npm仓库,自己只有下载的权限,目前该仓库中代理源有2个npm-taobao,npm-taobao2
这2个源都组合在npm-ep这个源地址下,公司对外也只提供npm-ep这个源地址。但是这个ep源在从前面提到的2个代理源同步依赖组件时,各自都有出现同步不完整导致依赖包不完整缺失的情况。比如在npm-taobao源中jsbn这个插件就有缺失不完整文件损坏的情况,但是print-js是正常的。npm-taobao-2的源中print-js出现损坏的情况,但是jsbn正常的。自己本地下载依赖是从npm-ep下载,可恶的就是ep源在nexus上面看的时候很多依赖包都是以损坏的那个为主,导致本地下载无法完成。
node:16.20.2 npm:8.19.4
第一次初始化安装时

自己的思路是:本地先设置源地址npm-taobao,先下载一部分,下载失败后切换到npm-taobao2再下载,下载失败后再切换到npm-ep,这样貌似不得行.
npm install安装失败后,会自动删除node_modules。
后续切换到低版本的node和npm 设置npm config set rollback false。
node_modules确实不自动删除了,但是下载依然是报错,无法正常安装

第一点:工程是我自己npm init -y创建的新工程,里面除了package.json之外,甚至package-lock.json都没有。
第二点:所有的操作之前都会执行下npm cache clean --force 清理缓存。
第三点:不知道是因为node版本的原因还是内网环境原因,npm cli命令不支持,无法使用。
第四点:应该是 @vue/cli中的某些深层次依赖包出现了问题,所以没办法使用npm scoped域的方式设置不同源地址的方式解决。因为你甚至无法搞清楚,到底有多少依赖包出了问题,只知道有很多@vue/cli深层依赖包出了问题,而这些依赖包大部分在npm-taobao和npm-taobao2两个源中都有,只是在2个源地址中交替正常和异常。

阅读 2.5k
1 个回答

建多源配置文件就行
建一个 .npmrc :


registry=http://your-nexus-url/repository/npm-taobao/
registry.fallback[0]=http://your-nexus-url/repository/npm-taobao2/
registry.fallback[1]=http://your-nexus-url/repository/npm-ep/

写自动切换源的脚本
install.js:

const { execSync } = require('child_process');
const fs = require('fs');

const registries = [
  'http://your-nexus-url/repository/npm-taobao/',
  'http://your-nexus-url/repository/npm-taobao2/',
  'http://your-nexus-url/repository/npm-ep/'
];

const dependencies = {};
let success = true;

// 读取 package.json
const packageJson = JSON.parse(fs.readFileSync('./package.json'));

// 解析所有依赖
Object.assign(dependencies, 
  packageJson.dependencies || {},
  packageJson.devDependencies || {}
);

// 为每个依赖尝试不同源
for (const [pkg, version] of Object.entries(dependencies)) {
  let installed = false;
  
  for (const registry of registries) {
    try {
      console.log(`Trying to install ${pkg}@${version} from ${registry}`);
      execSync(`npm install ${pkg}@${version} --registry=${registry} --no-save`, {
        stdio: 'inherit'
      });
      installed = true;
      break;
    } catch (err) {
      console.log(`Failed to install from ${registry}, trying next...`);
    }
  }
  
  if (!installed) {
    success = false;
    console.error(`Failed to install ${pkg} from all registries`);
  }
}

if (success) {
  // 安装成功后生成 package-lock.json
  execSync('npm install --package-lock-only', { stdio: 'inherit' });
}

用法:


# 设不自动删除 node_modules
npm config set rollback false

# 清缓存
npm cache clean --force

# 运行安装脚本
node install.js
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏