UNPKG

wn-command-publish

Version:
433 lines (405 loc) 23.2 kB
'use strict'; /* * 1.首先判断该目录有没有package.json,如果有则说明该模块是从spm平台安装的模块, * 如果没有则开始询问模块名,版本号,和依赖情况,模块类型(组件,css,js)生成一个默认的package.json * 2.如果模块类型是组件,拷贝该目录到www临时目录/wn-publish-tmp/spm_modules,同时生成一个调用该模块的 * 页面到该目录的views里,然后在www临时目录/wn-publish-tmp/运行wn release,生成到当前目录的examples/demo/目录里 * 3.在该目录运行spm doc,和spm publish * */ var exec = require('child_process').exec, //rd = require('rd'), child; var root=fis.util.realpath(process.cwd()); var rootPathInfo=fis.util.pathinfo(root); var parsedRootPath=parsePath(root); var wwwTmpRoot=fis.project.getTempPath('www'); var fs=require('fs'); var fse = require('fs-extra'); var inquirer = require("inquirer"); var Download = require('download'); var progress = require('download-status'); exports.name = 'publish'; exports.usage = '[options]'; exports.desc = 'publish package'; exports.register = function (commander){ commander .option('-c, --customUrl <url>', 'publish to custom url, eq: http://spm.yearn.cc', String, 'http://spm.yearn.cc') .option('-i, --inner', 'publish to inner http://spm.woniu.com', String, 'http://spm.woniu.com') .option('-o, --outer', 'publish to outer http://spmjs.io', String, 'http://spm.alipay.im') .option('-d, --doc','publish doc only', Boolean, true) .on('--help', function(){ console.log(' Examples:'.blue.bold); console.log(''); console.log(' $ '+'wn publish'.blue.bold+' -d'); console.log(' $ '+'wn publish'.blue.bold+' -c http://spm.xxx.com'); console.log(''); }) .action(function () { var packageJsonPath='./package.json'; var fisConfPath='./fis-conf.js'; var readMeFile='./README.md'; var options = arguments[arguments.length - 1]; //通过参数配置上传网址 if(options.inner||options.outer||options.customUrl){ child = exec('spm config set registry '+(options.customUrl||options.outer||options.inner), function (error, stdout, stderr) { console.log(stdout); console.log(stderr); if (error !== null) { console.log('exec error: ' + error); }else{ if(!fs.existsSync(packageJsonPath)){ //如果没有预置的package.Json,输出一个 inquirer.prompt([ { type:'input', name:'moduleName', message:'模块名称是(不能有中文)?', default:parsedRootPath.name,//默认为文件名 validate:function(projectName){ if(/^[\u2E80-\u9FFF]+$/g.test(projectName)){ //如果有汉字 return false; } return true; } }, { type:'input', name:'moduleDescription', message:'模块描述?', default:parsedRootPath.name }, { type:'input', name:'moduleVersion', message:'版本号?', default:parsedRootPath.version?parsedRootPath.version:'0.0.1' }, { type:'list', name:'moduleType', message:'模块类型是?', default:'js', choices:['组件','css','js'] }, // { // type:'input', // name:'moduleMain', // message:'模块主入口文件是?', // default:'index.js' // }, { type:'input', name:'moduleDeps', message:'依赖哪些模块?', default:'' } ], function( answers ) { ensureReadMeFile(readMeFile,answers); fse.outputJsonSync(packageJsonPath, { name: answers.moduleName, version:answers.moduleVersion, description: answers.moduleDescription, keywords: [ answers.moduleName, answers.moduleDescription ], homepage: "", author: "snail-team", spm:{ main:'',//为了解决spm doc会编译main文件因为wn语法报错问题,故设为空,answers.moduleMain type:answers.moduleType, dependencies:cwdToObj(answers.moduleDeps), devDependencies: { "expect.js": "0.3.1" } } }); if(answers.moduleType=='组件'){ generateDemoAndPublish(answers); }else{ publish(); } }); }else{ //有预置的package.json var packageJson=fse.readJsonSync(packageJsonPath); if(!packageJson.spm.type){ inquirer.prompt([ { type:'list', name:'moduleType', message:'模块类型是?', default:'js', choices:['组件','css','js'] } ], function( answers ) { packageJson.spm.type=answers.moduleType; //将spm.dependencies改动写入packageJson fse.writeJsonSync(packageJsonPath, packageJson); ensureReadMeFile(readMeFile,{moduleName:packageJson.name,moduleVersion:packageJson.version}); if(answers.moduleType=='组件'){ generateDemoAndPublish({moduleName:packageJson.name,moduleVersion:packageJson.version}); }else{ publish(); } }); }else if(packageJson.spm.type=='组件'){ generateDemoAndPublish({moduleName:packageJson.name,moduleVersion:packageJson.version}); }else if(packageJson.spm.type!='组件'){ publish(); } } } }); } // if(options.outer){ // child = exec('spm config set registry '+options.outer, // function (error, stdout, stderr) { // if (error !== null) { // console.log('exec error: ' + error); // } // }); // } // if(options.customUrl){ // child = exec('spm config set registry '+options.customUrl, // function (error, stdout, stderr) { // if (error !== null) { // console.log('exec error: ' + error); // } // }); // } function ensureReadMeFile(file,answers){ /* 保证readme文件的存在,存在则替换里面的name和version变量,不存在则创建一个readme文件 */ //var stat = fs.lstatSync(file); if(fs.existsSync(file)){ var content=fs.readFileSync(file,'utf8'); if(typeof content == 'object'){ content=JSON.stringify(content); } content=content.replace(/\<\%name\%\>/g,answers.moduleName); content=content.replace(/\<\%version\%\>/g,answers.moduleVersion); fs.writeFileSync(file,content,'utf8'); }else{ fs.writeFileSync(file, '# '+answers.moduleName+'\r\n'+answers.moduleName,'utf8'); } } function generateDemoAndPublish(answers){ //console.log(wwwTmpRoot); //删除demo缓存文件,以免另一个组件生成demo,文件污染 fse.removeSync(wwwTmpRoot+'/wn-publish-tmp/'); fse.removeSync('./demo/'); fse.removeSync('./_site/'); fse.removeSync('./spm_modules/'); var targetDir=wwwTmpRoot+'/wn-publish-tmp/spm_modules/'+answers.moduleName+'/'+answers.moduleVersion; //console.log(targetDir); fse.ensureDir(targetDir, function(err) { if(err){ console.log(err); // => null } process.chdir(wwwTmpRoot+'/wn-publish-tmp/'); //拷贝模块的package.json文件到wwwTmpRoot+'/wn-publish-tmp/' fse.copy(root+'/package.json', wwwTmpRoot+'/wn-publish-tmp/package.json', function(err) { if (err) return console.error(err); //从wn-data下载view模板和配置文件、package.json文件到wwwTmpRoot+'/wn-publish-tmp/ console.log('请稍等,正在下载demo模板...'); var download = new Download({ extract: true, strip: 1, mode: '755' }) //'https://codeload.github.com/snail-team/' +projectAlias[answers.gameType] + '/tar.gz/master' //'https://github.com/snail-team/'+projectAlias[answers.gameType]+'/archive/master.zip' //'https://raw.githubusercontent.com/scrat-team/scrat.js/master/scrat.js' .get('https://github.com/snail-team/wn-module-demo/archive/master.zip') .dest('./') .use(progress()); download.run(function (err, files, stream) { if (err) { throw err; } console.log('demo模板已下载完毕!'); //执行模板变量替换 var viewsFile=wwwTmpRoot+'/wn-publish-tmp/views/index.html'; var stat = fs.lstatSync(viewsFile); if(stat.isFile()){ var content=fs.readFileSync(viewsFile,'utf8'); if(typeof content == 'object'){ content=JSON.stringify(content); } content=content.replace(/\<\%name\%\>/g,answers.moduleName); content=content.replace(/\<\%version\%\>/g,answers.moduleVersion); fs.writeFileSync(viewsFile,content,'utf8'); } var fisConfContent; if(options.inner){ fisConfContent=fs.readFileSync(fisConfPath,'utf-8'); fisConfContent=fisConfContent.replace(/http\:\/\/spm\.woniu\.com/g,options.inner); fs.writeFileSync(fisConfPath,fisConfContent,'utf-8'); } if(options.outer){ fisConfContent=fs.readFileSync(fisConfPath,'utf-8'); fisConfContent=fisConfContent.replace(/http\:\/\/spm\.woniu\.com/g,options.outer); fs.writeFileSync(fisConfPath,fisConfContent,'utf-8'); } if(options.customUrl){ fisConfContent=fs.readFileSync(fisConfPath,'utf-8'); fisConfContent=fisConfContent.replace(/http\:\/\/spm\.woniu\.com/g,options.customUrl); fs.writeFileSync(fisConfPath,fisConfContent,'utf-8'); } //安装依赖到wwwTmpRoot+'/wn-publish-tmp/目录里,以便release的是完整的demo child = exec('spm install', function (error, stdout, stderr) { console.log(stdout); console.log(stderr); //依赖模块安装完成后再release fse.copy(root, targetDir, function(err) { if (err) return console.error(err); console.log("开始生成demo!"); //process.chdir(wwwTmpRoot+'/wn-publish-tmp/'); child = exec('wn release -cDo -d '+root, function (error, stdout, stderr) { console.log(stdout); console.log(stderr); if (error !== null) { console.log('exec error: ' + error); }else{ publish(); console.log("demo生成成功!"); } }); }); if (error !== null) { console.log('exec error: ' + error); } }); }); }); }); } function publish(){ //开始生成doc,切换至根目录 console.log("开始生成doc!"); process.chdir(root); //删除demo缓存文件,以免另一个组件生成demo,文件污染 fse.removeSync(wwwTmpRoot+'/wn-publish-tmp/'); child = exec('spm install', function (error, stdout, stderr) { console.log(stdout); console.log(stderr); child = exec('spm doc build', function (error, stdout, stderr) { console.log(stdout); console.log(stderr); child = exec('spm doc publish', function (error, stdout, stderr) { console.log(stdout); console.log(stderr); //最好删除spm_modules,不然感觉doc的生成,有点污染源目录,最后上传该模块 if(!options.doc){//如果doc参数不存在则执行spm publish fse.removeSync('./demo/'); fse.removeSync('./_site/'); fse.removeSync('./spm_modules/'); child = exec('spm publish', function (error, stdout, stderr) { console.log(stdout); console.log(stderr); if (error !== null) { console.log('exec error: ' + error); }else{ console.log("spm publish成功!"); } }); } if (error !== null) { console.log('exec error: ' + error); }else{ console.log("spm doc publish成功!"); } }); if (error !== null) { console.log('exec error: ' + error); }else{ console.log("spm doc build成功!"); } }); if (error !== null) { console.log('exec error: ' + error); }else{ console.log("模块依赖安装成功!"); } }); } function cwdToObj(deps){ //jquery@1.8.3 nav@0.0.2 var depsObj={}, tmpArr=deps.split(' '); for(var i=0;i<tmpArr.length;i++){ var module=tmpArr[i]; if(module&&module!=''){ var moduleName,moduleVersion; if(/@/g.test(module)){ moduleName=module.split('@')[0]; moduleVersion=module.split('@')[1]; depsObj[moduleName]=moduleVersion; }else{ moduleName=module; moduleVersion='stable'; depsObj[moduleName]=moduleVersion; } } } return depsObj;//{jquery:'1.8.3',nav:'0.0.2'} } function initPackageJson(answers){ //写一个spm发布用的package.json console.log('开始生成初始package.json!'); if(!fs.existsSync(packageJson)){ //如果没有预置的package.Json,输出一个 fse.outputJsonSync(packageJson, {name: answers.projectName}); } } // var argsStr=getArgsStr(); // child = exec('spm install '+argsStr, // function (error, stdout, stderr) { // console.log('install: ' + stdout); // console.log(stderr); // if (error !== null) { // console.log('exec error: ' + error); // } // }); // function getArgsStr(){ // var str=''; // for(var i=0;i<process.argv.length;i++){ // if(i>2){ // str+=process.argv[i]+' '; // }else if(i==process.argv.length-1){ // str+=process.argv[i]; // } // } // return str; // } // function parseArgs(args){ // var str={args:'',options:{}}; // for(var i in args){ // if(typeof args[i] == 'string'){ // str.args+=args[i]+' '; // }else if(typeof args[i] == 'object'){ // str.options=args[i]; // } // } // return str; // } }); }; function parsePath(path){ //判断模块的模块名和版本号情况 //D:/senro/senro/git/company/wn/wn-site/spm_modules/wn-9yin-nav/0.0.6 var tmpPath=path.split('/'); if(/[0-9]*\.[0-9]*\.[0-9]*/g.test(tmpPath[tmpPath.length-1])){ //最后的名字是版本号,说明这是个从spm_modules安装的模块 return {name:tmpPath[tmpPath.length-2],version:tmpPath[tmpPath.length-1]}; }else{ //最后的名字不是版本号,说明这是个本地模块 return {name:tmpPath[tmpPath.length-1],version:''}; } }