UNPKG

@kd-kfront/knpm

Version:

knpm: npm client for knpm

253 lines (228 loc) 7.38 kB
'use strict'; /* eslint-disable */ const debug = require('debug')('knpm:origin'); const match = require('auto-correct'); const request = require('request'); const spawn = require('cross-spawn'); const cp = require('child_process'); const fs = require('fs'); const path = require('path'); const config = require('./config'); const parseArgv = require('./parse_argv'); const program = parseArgv(); const rawArgs = program.rawArgs.slice(2); const args = []; let isInstall = false; let isUnInstall = false; let installer = 'npminstall-nouse'; let uninstaller = 'npmuninstall-nouse'; let packageInfo = {}; for (let i = 0; i < rawArgs.length; i++) { let arg = rawArgs[i]; if (arg[0] !== '-') { arg = correct(arg); } if (i === 0 && (arg === 'i' || arg === 'install')) { isInstall = true; let packageLockPath = path.resolve(process.cwd(), './package-lock.json'); // console.log("packageLockPath===", packageLockPath); if (fs.existsSync(packageLockPath)) { // console.log('该路径已存在'); // fs.unlink(packageLockPath, (err) => { // if (err) { // process.exit(); // throw err; // } // console.log('文件已被删除'); // }); try { fs.unlinkSync(packageLockPath); } catch (e) { console.error("remove package-lock.json error:",e); process.exit(1); } } continue; } else if (i === 0 && (arg === 'un' || arg === 'uninstall')) { isUnInstall = true; continue; } // support `$ knpm i --by=npm` if (arg.indexOf('--by=') === 0) { installer = arg.split('=', 2)[1]; continue; } args.push(arg); } const env = Object.assign({}, process.env); const CWD = process.cwd(); let theRegistry = program.registry; if (program.registry.endsWith('/')) { theRegistry = theRegistry.substring(0, theRegistry.length - 1); } // if (theRegistry === config.knpmRegistry && (isInstall || isUnInstall)) { // args.unshift('--registry=' + theRegistry + '/knpm-server-router'); // } else { // args.unshift('--registry=' + program.registry); // } // console.log('theRegistry:',theRegistry) // 如果是公司内网环境 if (process.env.netRight === 'true') { // if (theRegistry === config.knpmRegistry && (isInstall || isUnInstall)) { // args.unshift('--registry=' + theRegistry + '/knpm-server-router'); // } else { // args.unshift('--registry=' + program.registry); // } args.unshift('--registry=' + theRegistry); } else { args.unshift('--registry=https://registry.npm.taobao.org/'); } if (program.disturl) { args.unshift('--disturl=' + program.disturl); } if (program.userconfig) { args.unshift('--userconfig=' + program.userconfig); } if (program.proxy) { debug('use program.proxy: %s', program.proxy); args.unshift('--proxy=' + program.proxy); } else if (config.proxy) { debug('use config.proxy: %s', config.proxy); args.unshift('--proxy=' + config.proxy); } // console.log('args==',args) let npmBin; let execMethod = spawn; const stdio = [ process.stdin, process.stdout, process.stderr, ]; if (isInstall) { npmBin = path.join(__dirname, '..', 'node_modules', '.bin', installer); // // 收集下载包情况 // let packageArr = args.filter(arg => !arg.startsWith('-')); // if (packageArr.length > 0) { // let installName = packageArr[0]; // let packageName; // if (installName.startsWith('@')) { // packageName = installName.substring(0, installName.lastIndexOf('@') != 0 ? installName.lastIndexOf('@') : installName.length); // packageInfo[packageName] = installName.lastIndexOf('@') != 0 ? installName.substring(installName.lastIndexOf('@') + 1) : ''; // } else { // packageName = installName.substring(0, installName.includes('@') ? installName.indexOf('@') : installName.length); // packageInfo[packageName] = installName.includes('@') ? installName.substring(installName.indexOf('@') + 1) : ''; // } // } else { // try { // let packageJsonPath = path.resolve(CWD, './package.json'); // if (fs.existsSync(packageJsonPath)) { // let data = fs.readFileSync(packageJsonPath, 'utf-8'); // let packageJson = JSON.parse(data); // if (args.includes('--production')) { // let dependencies = packageJson.dependencies; // packageInfo = dependencies; // } else { // packageInfo = Object.assign({}, packageJson.dependencies, packageJson.devDependencies); // } // } // } catch (err) { // } // } if (installer === 'npminstall') { // use fork to spawn can fix install knpm itself fail on Windows execMethod = cp.fork; stdio.push('ipc'); npmBin = require.resolve('npminstall/bin/install.js'); args.unshift('--china'); args.unshift('--fix-bug-versions'); } else { // other installer, like npm args.unshift('install'); } // maybe outside installer, just use installer as binary name if (!fs.existsSync(npmBin)) { // npmBin = installer; npmBin = path.join(__dirname, '..', 'node_modules', '.bin', 'npm'); } } else if (isUnInstall) { npmBin = path.join(__dirname, '..', 'node_modules', '.bin', uninstaller); if (uninstaller === 'npmuninstall') { // use fork to spawn can fix install knpm itself fail on Windows execMethod = cp.fork; stdio.push('ipc'); npmBin = require.resolve('npminstall/bin/uninstall.js'); args.unshift('--china'); args.unshift('--fix-bug-versions'); } else { // other installer, like npm args.unshift('uninstall'); } // maybe outside uninstaller, just use uninstaller as binary name if (!fs.existsSync(npmBin)) { // npmBin = uninstaller; npmBin = path.join(__dirname, '..', 'node_modules', '.bin', 'npm'); } } else { npmBin = path.join(__dirname, '..', 'node_modules', '.bin', 'npm'); } debug('%s %s', npmBin, args.join(' ')); // console.log(args, 'args-origin_npm') // console.log(npmBin, 'npmBin') const child = execMethod(npmBin, args, { env, cwd: CWD, stdio, }); child.on('exit', code => { process.exit(code); // 发送下载包情况 let keys = Object.keys(packageInfo); if (code == 0 && keys.length > 0 && theRegistry === config.knpmRegistry) { let packageLockJsonPath = path.resolve(CWD, './package-lock.json'); if (fs.existsSync(packageLockJsonPath)) { let data = fs.readFileSync(packageLockJsonPath, 'utf-8'); let packageLockJson = JSON.parse(data); keys.map(key => { if (packageLockJson.dependencies[key]) { packageInfo[key] = packageLockJson.dependencies[key].version; } else { packageInfo[key] = undefined; } }).filter(key => packageInfo[key]); } // console.log(packageInfo, 'packageInfo'); let postParam = { dependencies: JSON.stringify(packageInfo) }; request({ // url: theRegistry + '/knpm-server-router/package/install/statistics', url: theRegistry + '/package/install/statistics', method: 'POST', json: true, headers: { "content-type": 'application/json', }, body: JSON.stringify(postParam) }, () => { process.exit(code); }); } else { process.exit(code); } }); function correct(command) { const cmds = [ 'install', 'publish', 'adduser', 'author', 'config', 'unpublish', ]; for (const cmd of cmds) { if (match(command, cmd)) { return cmd; } } return command; }