publish.js 3.99 KB
Newer Older
liujiangnan's avatar
liujiangnan committed
1 2 3 4 5 6 7 8 9
/****
 * 批量编译打包模板工具
 * 运行 npm run publish T_01 命令来打包T_01模板
 * 运行 npm run publish T_01,T_02,T_03,T_04  命令来分别打包 T_01,T_02,T_03,T_04 这四个模板,注意逗号要用英文的
 * 运行 npm run publish all 命令来打包所有模板
 */
  
const path = require("path");
const fs = require("fs");
liujiangnan's avatar
liujiangnan committed
10
const fsp = fs.promises;
liujiangnan's avatar
liujiangnan committed
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
const os = require('os');
const compressing = require("compressing");

//Linux系统上'Linux'
//macOS 系统上'Darwin' 
//Windows系统上'Windows_NT'
let sysType = os.type(); 

Date.prototype.Format = function(fmt) {
  var o = {
      "M+" : this.getMonth() + 1,
      "d+" : this.getDate(),
      "h+" : this.getHours(),
      "m+" : this.getMinutes(),
      "s+" : this.getSeconds(),
      "q+" : Math.floor((this.getMonth() + 3) / 3),
      "S" : this.getMilliseconds()
  };
  if (/(y+)/.test(fmt))
      fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  for (var k in o)
  if (new RegExp("(" + k + ")").test(fmt))
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  return fmt;
}

function clean(zipPath){
  if(fs.existsSync(zipPath)){
    fs.unlinkSync(zipPath);
  }
}

liujiangnan's avatar
liujiangnan committed
43 44 45 46 47 48 49 50 51
var copy=async function(src,dst){
  let paths = await fsp.readdir(src); //同步读取当前目录
  for(let i=0;i<paths.length;i++){
    let path = paths[i];
    var _src=src+'/'+path;
    var _dst=dst+'/'+path;
    var stats = await fsp.stat(_src);

    if(stats.isFile()){ //如果是个文件则拷贝 
52
      await fsp.copyFile(_src, _dst);
liujiangnan's avatar
liujiangnan committed
53 54 55 56 57 58 59 60 61 62
    }else if(stats.isDirectory()){ //是目录则 递归 
      try {
        await fsp.access(_dst, fs.constants.F_OK);
      } catch (error) {
        fs.mkdirSync(_dst);
      } 
      await copy(_src,_dst);
    }
  } 
} 
liujiangnan's avatar
liujiangnan committed
63 64 65

const runSpawn = async function (){ 

liujiangnan's avatar
liujiangnan committed
66 67 68 69 70 71
  try {
    await fsp.access(path.resolve(__dirname,"../dist/form"), fs.constants.F_OK);
  } catch (error) {
    fs.mkdirSync(path.resolve(__dirname,"../dist/form"));
  } 
  try {
liujiangnan's avatar
liujiangnan committed
72
    await fsp.access(path.resolve(__dirname,"../dist/play"), fs.constants.F_OK);
liujiangnan's avatar
liujiangnan committed
73
  } catch (error) {
liujiangnan's avatar
liujiangnan committed
74
    fs.mkdirSync(path.resolve(__dirname,"../dist/play"));
liujiangnan's avatar
liujiangnan committed
75 76 77 78 79 80 81
  } 
  try {
    await fsp.access(path.resolve(__dirname,"../dist/lib"), fs.constants.F_OK);
  } catch (error) {
    fs.mkdirSync(path.resolve(__dirname,"../dist/lib"));
  } 
  await copy(path.resolve(__dirname,"../form"), path.resolve(__dirname,"../dist/form")); 
liujiangnan's avatar
liujiangnan committed
82
  await copy(path.resolve(__dirname,"../play"), path.resolve(__dirname,"../dist/play")); 
liujiangnan's avatar
liujiangnan committed
83
  await copy(path.resolve(__dirname,"../lib"), path.resolve(__dirname,"../dist/lib"));  
liujiangnan's avatar
liujiangnan committed
84

liujiangnan's avatar
liujiangnan committed
85
  let str = fs.readFileSync(path.resolve(__dirname,"../dist/play/index.html"),{encoding: 'utf8'});
liujiangnan's avatar
liujiangnan committed
86
  str = str.replace('<base href="">','<base href="template-base-href">'); 
liujiangnan's avatar
liujiangnan committed
87
  fs.writeFileSync(path.resolve(__dirname,"../dist/play/index.html"),str);
liujiangnan's avatar
liujiangnan committed
88

liujiangnan's avatar
liujiangnan committed
89 90
  await new Promise(function(resolve,reject){  
    let pkg = require("../package.json");  
liujiangnan's avatar
liujiangnan committed
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
    //要压缩的目录
    let zippath = path.resolve(__dirname,"../dist");  
    //压缩包的存放目录
    let date = new Date();
    let zipname = pkg.name+"_"+date.Format("yyyyMMdd hh-mm-ss");
    let zipdir = path.resolve(__dirname,"../publish/"+zipname+".zip");
    clean(zipdir); //删除原有的包
  
    const tarStream = new compressing.zip.Stream();
    fs.readdir(zippath,function(err,files){
      if(err){
        console.log("======文件打开异常======");
        console.log(err);
        reject();
      }
      for(let i=0;i<files.length;i++){
        tarStream.addEntry(zippath+"/"+files[i]);
      }
      let writeStream = fs.createWriteStream(zipdir);
      tarStream.pipe(writeStream); 
      writeStream.on('close', () => {
          console.log(`模板 ${pkg.name} 打包已完成!`);
          resolve();
      })
    });  

  }); 
}

// let projects = "";
// if(process.argv.length<3){
//   console.log("缺少参数");
//   return;
// }
// projects = process.argv[2];  

let exec = async function(){
  //压缩模板
  await runSpawn();
}

liujiangnan's avatar
liujiangnan committed
132
exec();  
liujiangnan's avatar
liujiangnan committed
133