From 9468e66706013c05cf299e18240b7eb592bacdba Mon Sep 17 00:00:00 2001
From: liujiangnan <695541723@qq.com>
Date: Wed, 4 Sep 2019 22:45:15 +0800
Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=89=93=E5=8C=85=E8=84=9A?=
 =?UTF-8?q?=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 angular.json      |   2 +-
 bin/publish.js    | 115 ++++++++++++++++++++++++++++++++++++++++++++++
 package-lock.json | 100 ++++++++++++++++++++++++++++++++++++++--
 package.json      |   2 +
 publish/.keep     |   0
 5 files changed, 213 insertions(+), 6 deletions(-)
 create mode 100644 bin/publish.js
 create mode 100644 publish/.keep

diff --git a/angular.json b/angular.json
index 2633fea..0aaaa7a 100644
--- a/angular.json
+++ b/angular.json
@@ -17,7 +17,7 @@
         "build": {
           "builder": "@angular-devkit/build-angular:browser",
           "options": {
-            "outputPath": "dist/ng-one",
+            "outputPath": "dist",
             "index": "src/index.html",
             "main": "src/main.ts",
             "polyfills": "src/polyfills.ts",
diff --git a/bin/publish.js b/bin/publish.js
new file mode 100644
index 0000000..4eb6931
--- /dev/null
+++ b/bin/publish.js
@@ -0,0 +1,115 @@
+/****
+ * 批量编译打包模板工具
+ * 运行 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 spawn = require('child_process').spawn;
+const path = require("path");
+const fs = require("fs");
+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);
+  }
+}
+
+const runSpawn = async function (){
+
+  await new Promise(function(resolve,reject){
+
+    let pkg = require("../package.json"); 
+
+    let ls; 
+    if(sysType==="Windows_NT"){
+      //ng build --prod --build--optimizer --base-href /ng-one/
+      ls = spawn("cmd.exe", ['/c', 'ng', 'build', '--prod', '--build--optimizer', '--base-href', `/${pkg.name}/`] );
+    }else{
+      ls = spawn("ng", ['build', '--prod', '--build--optimizer', '--base-href', `/${pkg.name}/`] );
+    }
+
+    ls.stdout.on('data', (data) => {
+      console.log(` ${data}`);
+    });
+    
+    ls.stderr.on('data', (data) => {
+      console.log(`stderr: ${data}`);
+      reject();
+    });
+
+    ls.on('close', (code) => {
+      console.log(`child process exited with code ${code}`);
+      //要压缩的目录
+      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();
+}
+
+exec();
+
+ 
+
+ 
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 3a19fdb..a94c2bc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2517,6 +2517,15 @@
         "underscore": "~1.4.4"
       }
     },
+    "bl": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
+      "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
+      "requires": {
+        "readable-stream": "^2.3.5",
+        "safe-buffer": "^5.1.1"
+      }
+    },
     "blob": {
       "version": "0.0.5",
       "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz",
@@ -2776,7 +2785,6 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
       "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
-      "dev": true,
       "requires": {
         "buffer-alloc-unsafe": "^1.1.0",
         "buffer-fill": "^1.0.0"
@@ -2785,14 +2793,17 @@
     "buffer-alloc-unsafe": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
-      "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
-      "dev": true
+      "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
+    },
+    "buffer-crc32": {
+      "version": "0.2.13",
+      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
     },
     "buffer-fill": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
-      "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
-      "dev": true
+      "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
     },
     "buffer-from": {
       "version": "1.1.1",
@@ -3225,6 +3236,21 @@
         "mime-db": ">= 1.40.0 < 2"
       }
     },
+    "compressing": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/compressing/-/compressing-1.4.0.tgz",
+      "integrity": "sha512-7Y6aU45Ud0y7sxr8szQ91dJPHIENKmG0zD9bcLSZSGf67Xap/J8pqFGCklnrFavkl5taulZb7YvSa557mb732A==",
+      "requires": {
+        "flushwritable": "^1.0.0",
+        "get-ready": "^1.0.0",
+        "mkdirp": "^0.5.1",
+        "pump": "^3.0.0",
+        "streamifier": "^0.1.1",
+        "tar-stream": "^1.5.2",
+        "yauzl": "^2.7.0",
+        "yazl": "^2.4.2"
+      }
+    },
     "compression": {
       "version": "1.7.4",
       "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
@@ -4638,6 +4664,14 @@
         "websocket-driver": ">=0.5.1"
       }
     },
+    "fd-slicer": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+      "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
+      "requires": {
+        "pend": "~1.2.0"
+      }
+    },
     "figgy-pudding": {
       "version": "3.5.1",
       "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
@@ -4736,6 +4770,11 @@
         "readable-stream": "^2.3.6"
       }
     },
+    "flushwritable": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/flushwritable/-/flushwritable-1.0.0.tgz",
+      "integrity": "sha1-PjKNj95BKtR+c44751C00pAENJg="
+    },
     "follow-redirects": {
       "version": "1.8.1",
       "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.8.1.tgz",
@@ -4840,6 +4879,11 @@
         "null-check": "^1.0.0"
       }
     },
+    "fs-constants": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
+    },
     "fs-minipass": {
       "version": "1.2.6",
       "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz",
@@ -11667,6 +11711,11 @@
         "sha.js": "^2.4.8"
       }
     },
+    "pend": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+      "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
+    },
     "performance-now": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
@@ -13479,6 +13528,11 @@
       "resolved": "https://registry.npmjs.org/stream-wormhole/-/stream-wormhole-1.1.0.tgz",
       "integrity": "sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew=="
     },
+    "streamifier": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz",
+      "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8="
+    },
     "streamroller": {
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz",
@@ -13653,6 +13707,20 @@
         "inherits": "2"
       }
     },
+    "tar-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz",
+      "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
+      "requires": {
+        "bl": "^1.0.0",
+        "buffer-alloc": "^1.2.0",
+        "end-of-stream": "^1.0.0",
+        "fs-constants": "^1.0.0",
+        "readable-stream": "^2.3.0",
+        "to-buffer": "^1.1.1",
+        "xtend": "^4.0.0"
+      }
+    },
     "terser": {
       "version": "4.2.1",
       "resolved": "https://registry.npmjs.org/terser/-/terser-4.2.1.tgz",
@@ -13753,6 +13821,11 @@
       "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
       "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
     },
+    "to-buffer": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
+      "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg=="
+    },
     "to-fast-properties": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
@@ -14986,6 +15059,23 @@
         }
       }
     },
+    "yauzl": {
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+      "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
+      "requires": {
+        "buffer-crc32": "~0.2.3",
+        "fd-slicer": "~1.1.0"
+      }
+    },
+    "yazl": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz",
+      "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==",
+      "requires": {
+        "buffer-crc32": "~0.2.3"
+      }
+    },
     "yeast": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
diff --git a/package.json b/package.json
index 69174ff..f9a70b9 100644
--- a/package.json
+++ b/package.json
@@ -5,6 +5,7 @@
     "ng": "ng",
     "start": "ng serve",
     "build": "ng build --prod --build--optimizer --base-href /ng-one/",
+    "publish": "node ./bin/publish.js",
     "test": "ng test",
     "lint": "ng lint",
     "e2e": "ng e2e"
@@ -33,6 +34,7 @@
     "animate.css": "^3.7.0",
     "bootstrap": "^4.1.1",
     "browser-image-compression": "^1.0.5",
+    "compressing": "^1.4.0",
     "core-js": "^2.6.1",
     "cropperjs": "1.4.1",
     "css-element-queries": "^1.0.2",
diff --git a/publish/.keep b/publish/.keep
new file mode 100644
index 0000000..e69de29
-- 
2.21.0