publish.js 4.11 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 52 53 54 55 56 57 58 59 60 61 62 63 64
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()){ //如果是个文件则拷贝 
      let readable=fs.createReadStream(_src);//创建读取流
      let writable=fs.createWriteStream(_dst);//创建写入流
      readable.pipe(writable);
    }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
65 66 67

const runSpawn = async function (){ 

liujiangnan's avatar
liujiangnan committed
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
  try {
    await fsp.access(path.resolve(__dirname,"../dist/form"), fs.constants.F_OK);
  } catch (error) {
    fs.mkdirSync(path.resolve(__dirname,"../dist/form"));
  } 
  try {
    await fsp.access(path.resolve(__dirname,"../dist/index"), fs.constants.F_OK);
  } catch (error) {
    fs.mkdirSync(path.resolve(__dirname,"../dist/index"));
  } 
  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")); 
  await copy(path.resolve(__dirname,"../index"), path.resolve(__dirname,"../dist/index")); 
  await copy(path.resolve(__dirname,"../lib"), path.resolve(__dirname,"../dist/lib"));  
liujiangnan's avatar
liujiangnan committed
86

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

liujiangnan's avatar
liujiangnan committed
91 92
  await new Promise(function(resolve,reject){  
    let pkg = require("../package.json");  
liujiangnan's avatar
liujiangnan committed
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 132 133
    //要压缩的目录
    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
134
exec();  
liujiangnan's avatar
liujiangnan committed
135