nodejs tar 打包脚本,打包压缩文件文件夹

本文详细介绍了如何使用Node.js结合tar库来打包并压缩多个项目目录为tar.gz文件,包括过滤不需要的文件和目录,以及解压文件的示例。

用nodejs打包压缩文件

准备工作:

  • nodejs
  • npm i tar 安装 tar 包,用于打包压缩,命令类似 linux 下的 tar
const fs = require('fs')
const path = require('path')
const tar = require('tar')

function cleanFile(pathStr) {
  if (fs.existsSync(pathStr)) {
    const stat = fs.statSync(pathStr)
    if (stat.isDirectory()) {
      fs.rmSync(pathStr, { recursive: true })
    } else if (stat.isFile()) {
      fs.unlinkSync(pathStr)
    }
  }
}
function cleanPrepareDir(pathStr) {
  cleanFile(pathStr)
  fs.mkdirSync(pathStr)
}
function copyFile(sourcePath, targetPath) {
  // fs.copyFileSync(sourcePath, targetPath)
  return new Promise((resolve, reject) => {
    fs.copyFile(sourcePath, targetPath, resolve)
    console.log(`copy ${sourcePath} to ${targetPath} successed.`)
  })
}
function mkdir(pathStr) {
  if (!fs.existsSync(pathStr)) {
    fs.mkdirSync(pathStr)
  }
  return pathStr
}

// 根目录只能是当前执行的盘符 此处 / = D:
let today = new Date().toISOString().split(/T/)[0].replace(/-/g, '')
const packagePath = `D:/前端包/前端包${today}`
cleanPrepareDir(packagePath)


let path1 = 'D:/git_project/Admin/dist'
let path2 = 'D:/git_project/H5'
let path3 = 'D:/git_project/Wxmini'
const archiveMap = {
  copy() {
    return copyFile('./readme.md', `${packagePath}/readme.md`)
  },
  p1() {
    return new Promise((resolve, reject) => {
      tar
        .c(
          {
            gzip: true,
            cwd: path1, // tar 中的 -C 参数,用来指定压缩的目录
          },
          ['.']
        )
        .pipe(fs.createWriteStream(`${packagePath}/Admin.tar.gz`))
        .on('finish', resolve)
    })
  },
  p2() {
    return new Promise((resolve, reject) => {
      tar
        .c(
          {
            gzip: true,
            cwd: path2,
            filter(path, stat) {
              const ignoreFiles = ['.git', '.vscode', '^.env*', '^./scss']
              for (let i = 0; i < ignoreFiles.length; i++) {
                const reg = new RegExp(ignoreFiles[i], 'g')
                if (reg.test(path)) {
                  console.log(reg)
                  console.log('ignore', path)
                  return false
                }
              }
              return true
            },
          },
          ['.']
        )
        .pipe(fs.createWriteStream(`${packagePath}/H5.tar.gz`))
        .on('finish', resolve)
    })
  },
  p3() {
    return new Promise((resolve, reject) => {
      tar
        .c(
          {
            gzip: true,
            cwd: path3,
            filter(path, stat) {
              const ignoreFiles = [
                '.git',
                '.vscode',
                '^.env*',
                '.husky',
                '^./node_modules', // 排除根目录下的 node_modules, 但是不排除其他 node_modules, eg: src/node_modules
                '^./dist', // 排除根目录下的 dist,但是不排除其他目录的 dist eg: src/node_modules/@vant/dist
              ]
              for (let i = 0; i < ignoreFiles.length; i++) {
                let reg = new RegExp(ignoreFiles[i], 'g')
                if (reg.test(path)) {
                  console.log(reg)
                  console.log('ignore file', path)
                  return false
                }
              }
              return true
            },
          },
          ['.']
        )
        .pipe(fs.createWriteStream(`${packagePath}/Wxmini.tar.gz`))
        .on('finish', () => {
          resolve()
        })
    })
  },
  all() {
    return new Promise((resolve, reject) => {
      tar.c({
        gzip: true,
        cwd: packagePath
      }, 
        ['.']
      ).pipe(fs.createWriteStream(`${packagePath}.tar.gz`))
      .on('finish', () => {
        resolve()
      })
    })
  }
}
const flags = {
  copy: { archive: true}, // 说明文件
  p1: { archive: true }, //  运营后台
  p2: { archive: true }, // 静态资源
  p3: { archive: true }, // 小程序
  all: { merge: true}, // 合并打包
}
let packageList = []


Object.keys(flags).forEach((item) => {
  if (flags[item].archive) {
    packageList.push(archiveMap[item]())
  }
})


Promise.all(packageList)
  .then(() => {
    if(flags.all.merge) {
      archiveMap.all()
    }
    console.log('打包完成')
  })
  .catch((err) => {
    console.error('打包出错:', err)
    throw err
  })



// 解压示例
// let outputPath = mkdir(`${packagePath}/dist`)
// fs.createReadStream(`${packagePath}/Admin.tar.gz`).pipe(
//   tar.x({
//     strip: 1,
//     C: outputPath // alias for cwd:'some-dir', also ok,指定解压的目录
//   })
// )

### 如何在宝塔面板上部署 Node.js 服务器 #### 准备工作 为了成功部署 Node.js 应用程序,需确保已准备好运行环境并完成必要的配置。这包括安装 Node.js 和 NPM 工具以及设置好数据库(如果应用需要)。可以通过以下方式来实现这些目标。 #### 安装 Node.js 运行环境 Node.js 的安装可通过多种方法完成,在宝塔面板中推荐使用命令行工具或者直接通过面板内置软件商店进行安装。以下是具体操作: 1. **通过宝塔面板的软件管理功能安装** 登录到宝塔面板后,进入“软件商店”,搜索 `Node.js` 并选择合适的版本进行安装[^3]。此过程会自动处理依赖关系,简化了手动编译的过程。 2. **通过命令行安装特定版本** 如果需要自定义安装某个具体的 Node.js 版本,则可采用如下命令: ```bash wget https://nodejs.org/dist/v14.3.0/node-v14.3.0-linux-x64.tar.xz tar -xf node-v14.3.0-linux-x64.tar.xz sudo mv node-v14.3.0-linux-x64 /usr/local/nodejs export PATH=/usr/local/nodejs/bin:$PATH ``` 上述脚本用于下载指定版本的 Node.js 文件,并将其解压至 `/usr/local/nodejs/` 路径下,最后更新系统的 `$PATH` 变量以便全局调用 Node.js 命令[^2]。 #### 部署 Node.js 项目 当运行环境搭建完成后,下一步就是将实际的应用程序部署上去。 1. **上传应用程序文件** 使用压缩工具打包本地开发好的 Node.js 项目,随后借助 FTP 或者宝塔自带的文件管理器把该项目传输至服务器上的目标位置,比如 `/www/wwwroot/myapp/` 目录。注意连同 `node_modules` 文件夹一起上传,因为这是项目的依赖库所在之处。 2. **启动 Node.js 应用** 利用 SSH 访问远程主机终端界面,切换至刚才放置代码的工作区执行初始化指令: ```bash cd /www/wwwroot/myapp/ npm install --production pm2 start app.js --name my-app-name ``` 此处假设入口文件名为 `app.js` ,并且利用 PM2 来保持进程持续稳定运转[^1]。 3. **绑定域名与反向代理设定** 返回宝塔控制台页面创建一个新的站点关联上述路径地址,再开启 SSL 加密支持提升安全性。接着调整 Web Server (Nginx/Apache) 设置形成反向代理链路指向内部监听端口从而对外提供服务。 ```nginx server { listen 80; server_name yourdomain.com; location / { proxy_pass http://localhost:3000; # 替换为您的应用实际使用的端口号 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } ``` 以上即完成了整个基于宝塔面板构建 Node.js 生产环境的主要流程概述。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值