cnpm / cnpmjs.org

‼️ ‼️ ‼️ ‼️ DEPRECATED, please use https://github.com/cnpm/cnpmcore ‼️ ‼️ ‼️ ‼️
https://npmmirror.com
Other
3.55k stars 746 forks source link

如何在本地(内部局域网)实现下载 公共仓库的包 #1424

Closed johnsonGong closed 5 years ago

johnsonGong commented 5 years ago

背景:

  1. 公司的开发环境为: 独立的 内部局域网, 即:不能连接互联网;
  2. 想搭建内部 cnpm源, 实现 npm 的安装;
  3. cnpmjs.org 的服务器环境是 linux CentOS; 现状:
  4. 已实现 同步公共仓库比如: lodash 到本地 /root/.cnpmjs.org/nfs
  5. registryHost: '192.x.x.x' // 无效;
  6. 修改服务器上, lodash 其中一个包(lodash-4.17.11.tgz) 中的文件(package.json 增加量 描述,一次判断下载的版本 是 外网-淘宝,还是内网);
  7. 本地 cnpm修改 registry 指向 cnpm 服务器; 结果: 下载的 lodash 还是 外网的包!!
johnsonGong commented 5 years ago

希望是, 公共仓库同步到本地服务器后,执行 cnpm install 能从本地服务器下载,而不是 外网。

johnsonGong commented 5 years ago

'use strict';

var mkdirp = require('mkdirp'); var copy = require('copy-to'); var path = require('path'); var fs = require('fs'); var os = require('os'); var utility = require('utility');

var version = require('../package.json').version;

var root = path.dirname(__dirname); var dataDir = path.join(process.env.HOME || root, '.cnpmjs.org');

var config = { version: version, dataDir: dataDir,

/**

if (process.env.NODE_ENV === 'test') { config.enableAbbreviatedMetadata = true; }

if (process.env.NODE_ENV !== 'test') { var customConfig; if (process.env.NODE_ENV === 'development') { customConfig = path.join(root, 'config', 'config.js'); } else { // 1. try to load $dataDir/config.json first, not exists then goto 2. // 2. load config/config.js, everything in config.js will cover the same key in index.js customConfig = path.join(dataDir, 'config.json'); if (!fs.existsSync(customConfig)) { customConfig = path.join(root, 'config', 'config.js'); } } if (fs.existsSync(customConfig)) { copy(require(customConfig)).override(config); } }

mkdirp.sync(config.logdir); mkdirp.sync(config.uploadDir);

module.exports = config;

config.loadConfig = function (customConfig) { if (!customConfig) { return; } copy(customConfig).override(config); };

rhinoceros commented 5 years ago

背景:

  1. 公司的开发环境为: 独立的 内部局域网, 即:不能连接互联网;
  2. 想搭建内部 cnpm源, 实现 npm 的安装;
  3. cnpmjs.org 的服务器环境是 linux CentOS; 现状:
  4. 已实现 同步公共仓库比如: lodash 到本地 /root/.cnpmjs.org/nfs
  5. registryHost: '192.x.x.x' // 无效;
  6. 修改服务器上, lodash 其中一个包(lodash-4.17.11.tgz) 中的文件(package.json 增加量 描述,一次判断下载的版本 是 外网-淘宝,还是内网);
  7. 本地 cnpm修改 registry 指向 cnpm 服务器; 结果: 下载的 lodash 还是 外网的包!!

建议在公司内部新做一个lodash,命名成私有包:@your_company/lodash ,重新发布。 不建议你自己直接改nfs下的文件。(时间久了,改的多了,自己都记不清楚有哪些是改过的;而且自己改这类公共的包,可能造成其他公共包也直接应用了你改过的版本,引起混乱)

你可以考虑用这种模式: https://github.com/cnpm/cnpmjs.org/wiki/Different-Modes Private + Scope Mode config.enablePrivate = true && config.scopes = ['@cnpm', '@cnpmtest'] Everyone can install from this registry Only admins can publish to this registry Can publish with scope, and only in @cnpm and @cnpmtest

johnsonGong commented 5 years ago

背景:

  1. 公司的开发环境为: 独立的 内部局域网, 即:不能连接互联网;
  2. 想搭建内部 cnpm源, 实现 npm 的安装;
  3. cnpmjs.org 的服务器环境是 linux CentOS; 现状:
  4. 已实现 同步公共仓库比如: lodash 到本地 /root/.cnpmjs.org/nfs
  5. registryHost: '192.x.x.x' // 无效;
  6. 修改服务器上, lodash 其中一个包(lodash-4.17.11.tgz) 中的文件(package.json 增加量 描述,一次判断下载的版本 是 外网-淘宝,还是内网);
  7. 本地 cnpm修改 registry 指向 cnpm 服务器; 结果: 下载的 lodash 还是 外网的包!!

建议在公司内部新做一个lodash,命名成私有包:@your_company/lodash ,重新发布。 不建议你自己直接改nfs下的文件。(时间久了,改的多了,自己都记不清楚有哪些是改过的;而且自己改这类公共的包,可能造成其他公共包也直接应用了你改过的版本,引起混乱)

你可以考虑用这种模式: https://github.com/cnpm/cnpmjs.org/wiki/Different-Modes Private + Scope Mode config.enablePrivate = true && config.scopes = ['@cnpm', '@cnpmtest'] Everyone can install from this registry Only admins can publish to this registry Can publish with scope, and only in @cnpm and @cnpmtest

谢谢,把公共资源"包装"成私有资源, 想过这个方案,可是 太多了。。。后边再试试。


跟领导汇报过: 使用CNPM 搭建内网私有NPM源平台,特别是有 防火墙 (我们是 物理隔断。。。)的情况下, 暂不能实现。 原因: CNPM会检查 包的版本,查看是否有更新 --- 必须链接外网;

方案:

  1. 提供 代理域名 proxy -- 安全要求太高pass;
  2. 自行研究CNPM源代码,修改器逻辑(不让检查版本),直接从 nfs下载 -- 有点技术要求,后边会尝试下;
  3. 笨方法 -- 直接上传 node_modules;
johnsonGong commented 5 years ago

算了,暂时不用了。 3Q, cnpmjs.org.