首页 > 编程语言 >Node脚本打包uniapp热更新wgt文件

Node脚本打包uniapp热更新wgt文件

时间:2024-08-29 10:23:26浏览次数:17  
标签:Node uniapp const wgt build error path archive

通过脚本打包uniapp热更新wgt文件

前言:uniapp只能通过hbuilder打包wgt文件

目标:通过脚本命令打包wgt文件

实现思路

uniapp官方文档已经提供了wgt文件的的生成思路:

目前使用npm run build:app-plus会在/dist/build/app-plus下生成app打包资源。如需制作wgt包,将app-plus中的文件压缩成zip(注意:不要包含app-plus目录),再重命名为${appid}.wgtappidmanifest.json文件中的appid

package.json 注册脚本

wgtScripts.js 位于文件根目录

{
  "scripts": {
    "build:wgt": "node wgtScripts.js"
  }
}

编写脚本

  1. 执行 uni build -p app 打包资源文件
  2. 读取src/manifest.json中的版本号
  3. 在回调中通过archiver库压缩文件
  4. 重命名,并将文件放置dist 目录下

环境要求:安装 archiver

yarn add archiver

wgtScripts.js

// 脚本执行命令  yarn run build:wgt
const { exec } = require('child_process')
const fs = require('fs')
const archiver = require('archiver') // 用于压缩文件
const path = require('path')

// 获取项目根目录路径
const projectRoot = path.resolve(__dirname)
// 定义要执行的命令,打包 uniapp wgt 资源
const command = 'uni build -p app'

// 获取版本号
const getVersionName = () => {
  // 读取 manifest.json 中的版本号
  const manifestPath = path.resolve(__dirname, 'src/manifest.json')
  const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'))
  return manifest.versionName
}
// 将资源文件打压缩包
const compress = () => {
  const versionName = getVersionName()
  console.log('版本号: ', versionName)
  // 定义要打包的目录和输出的压缩包文件名
  const outputDirectory = path.resolve(__dirname, 'dist/build/app')
  const outputZip = path.resolve(__dirname, `dist/star-site-${versionName}.wgt`)
  const output = fs.createWriteStream(outputZip)
  const archive = archiver('zip', {
    zlib: { level: 9 }, // 设置压缩级别
  })
  // 监听所有 archive 数据已写入完成事件
  output.on('close', () => {
    console.log(`wgt已创建,总共 ${archive.pointer()} 字节`)
  })
  // 监听压缩过程中出现的警告(例如压缩过程中的可恢复错误)
  archive.on('warning', (err) => {
    if (err.code === 'ENOENT') {
      console.warn(err)
    } else {
      throw err
    }
  })
  // 监听压缩过程中出现的错误
  archive.on('error', (err) => {
    throw err
  })
  // 连接 archive 流和输出流
  archive.pipe(output)
  // 将指定目录中的内容添加到压缩包中
  archive.directory(outputDirectory, false)
  // 完成压缩
  archive.finalize()
}

const build = () => {
  // 1. 执行命令
  exec(command, { cwd: projectRoot }, (error, stdout, stderr) => {
    // uniapp 打包完成的回调
    if (error) {
      console.error(`执行命令时出错: ${error}`)
      return
    }
    // 2. 压缩 wgt 文件
    compress()
  })
}
build()
在根目录中执行yarn run build:wgt即可获得wgt文件

优化:打包完成通过 ftp 上传服务器

  1. 在文件压缩后建立ftp链接
  2. 向对应目录传递文件

环境要求:安装 archiver basic-ftp

yarn add archiver
yarn add basic-ftp

wgtScripts.js

// 脚本执行命令  yarn run build:wgt
const { exec } = require('child_process')
const fs = require('fs')
const archiver = require('archiver') // 用于压缩文件
const path = require('path')
const ftp = require('basic-ftp') // 用于建立 ftp 链接

// 获取项目根目录路径
const projectRoot = path.resolve(__dirname)
// 定义要执行的命令,打包 uniapp wgt 资源
const ftpInfo = {
  host: '116.****.****.****',
  user: '*****',
  password: '*****',
  secure: false, // 如果使用安全连接,设置为 true
}
const ftpFilePath = '/apks/'

// 获取版本号
const getVersionName = () => {
  // 读取 manifest.json 中的版本号
  const manifestPath = path.resolve(__dirname, 'src/manifest.json')
  const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'))
  return manifest.versionName
}
// 将资源文件打压缩包
const compress = (callback) => {
  const versionName = getVersionName()
  console.log('版本号: ', versionName)
  // 定义要打包的目录和输出的压缩包文件名
  const outputDirectory = path.resolve(__dirname, 'dist/build/app')
  const outputName = `star-site-${versionName}.wgt`
  const outputPath = `dist/${outputName}`
  const outputZip = path.resolve(__dirname, outputPath)
  const output = fs.createWriteStream(outputZip)
  const archive = archiver('zip', {
    zlib: { level: 9 }, // 设置压缩级别
  })
  // 监听所有 archive 数据已写入完成事件
  output.on('close', () => {
    console.log(`wgt已创建,总共 ${archive.pointer()} 字节`)
    callback && callback(outputPath, outputName)
  })
  // 监听压缩过程中出现的警告(例如压缩过程中的可恢复错误)
  archive.on('warning', (err) => {
    if (err.code === 'ENOENT') {
      console.warn(err)
    } else {
      throw err
    }
  })
  // 监听压缩过程中出现的错误
  archive.on('error', (err) => {
    throw err
  })
  // 连接 archive 流和输出流
  archive.pipe(output)
  // 将指定目录中的内容添加到压缩包中
  archive.directory(outputDirectory, false)
  // 完成压缩
  archive.finalize()
}

const ftpServer = async (outputPath, outputName) => {
  const client = new ftp.Client()
  client.ftp.verbose = true // 开启详细日志

  try {
    // 连接到 FTP 服务器
    await client.access(ftpInfo)
    console.log('FTP 连接成功')
    // 指定本地文件路径和远程上传路径
    const localFilePath = path.resolve(__dirname, outputPath)
    const remoteFilePath = `${ftpFilePath}${outputName}`

    // 上传文件
    await client.uploadFrom(localFilePath, remoteFilePath)
    console.log('文件上传成功')
  } catch (error) {
    console.error('文件上传失败:', error)
  }

  client.close() // 关闭连接
}

const build = () => {
  const command = 'uni build -p app'
  // 1. 执行命令
  exec(command, { cwd: projectRoot }, (error, stdout, stderr) => {
    // uniapp 打包完成的回调
    if (error) {
      console.error(`执行命令时出错: ${error}`)
      return
    }
    // 2. 压缩 wgt 文件
    compress((outputPath, outputName) => {
      // 3. 上传服务器
      ftpServer(outputPath, outputName)
    })
  })
}
build()

优化:选择上传的分支

  1. 选择上传服务器分支
  2. no表示不上传服务器

环境要求:安装 archiver

yarn add archiver
yarn add basic-ftp
yarn add inquirer

wgtScripts.js

// 脚本执行命令  yarn run build:wgt
const { exec } = require('child_process')
const fs = require('fs')
const archiver = require('archiver') // 用于压缩文件
const path = require('path')
const ftp = require('basic-ftp') // 用于建立 ftp 链接
const inquirer = require('inquirer') // 用于用户选择

const branchObj = {
  dev: {
    ftpInfo: {
      host: '116.****.****.****',
      user: '******',
      password: '*****',
      secure: false, // 如果使用安全连接,设置为 true
    },
    ftpFilePath: '/apks/devApks/',
  },
  test: {
    ftpInfo: {
      host: '116.****.****.****',
      user: '******',
      password: '******',
      secure: false,
    },
    ftpFilePath: '/apks/testApks/',
  },
  release: {
    ftpInfo: {
      host: '116.****.****.****',
      user: '******',
      password: '******',
      secure: false,
    },
    ftpFilePath: '/releaseApks/',
  },
  prod: {
    ftpInfo: {
      host: '116.****.****.****',
      user: '******',
      password: '******',
      secure: false,
    },
    ftpFilePath: '/prodApks/',
  },
}
const projectRoot = path.resolve(__dirname) // 获取项目根目录路径

// 获取版本号
const getVersionName = () => {
  // 读取 manifest.json 中的版本号
  const manifestPath = path.resolve(__dirname, 'src/manifest.json')
  const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'))
  return manifest.versionName
}
// 将资源文件打压缩包
const compress = (callback) => {
  const versionName = getVersionName()
  console.log('版本号: ', versionName)
  // 定义要打包的目录和输出的压缩包文件名
  const outputDirectory = path.resolve(__dirname, 'dist/build/app')
  const outputName = `star-site-${versionName}.wgt`
  const outputPath = `dist/${outputName}`
  const outputZip = path.resolve(__dirname, outputPath)
  const output = fs.createWriteStream(outputZip)
  const archive = archiver('zip', {
    zlib: { level: 9 }, // 设置压缩级别
  })
  // 监听所有 archive 数据已写入完成事件
  output.on('close', () => {
    console.log(`wgt已创建,总共 ${archive.pointer()} 字节`)
    callback && callback(outputPath, outputName)
  })
  // 监听压缩过程中出现的警告(例如压缩过程中的可恢复错误)
  archive.on('warning', (err) => {
    if (err.code === 'ENOENT') {
      console.warn(err)
    } else {
      throw err
    }
  })
  // 监听压缩过程中出现的错误
  archive.on('error', (err) => {
    throw err
  })
  // 连接 archive 流和输出流
  archive.pipe(output)
  // 将指定目录中的内容添加到压缩包中
  archive.directory(outputDirectory, false)
  // 完成压缩
  archive.finalize()
}

// 上传服务器
const ftpServer = async (outputPath, outputName, develop) => {
  const ftpInfo = branchObj[develop].ftpInfo
  const ftpFilePath = branchObj[develop].ftpFilePath
  const client = new ftp.Client()
  client.ftp.verbose = true // 开启详细日志

  try {
    // 连接到 FTP 服务器
    await client.access(ftpInfo)
    console.log('FTP 连接成功')
    // 指定本地文件路径和远程上传路径
    const localFilePath = path.resolve(__dirname, outputPath)
    const remoteFilePath = `${ftpFilePath}${outputName}`

    // 上传文件
    await client.uploadFrom(localFilePath, remoteFilePath)
    console.log('文件上传成功')
  } catch (error) {
    console.error('文件上传失败:', error)
  }

  client.close() // 关闭连接
}

// 选择环境
const selectEnvironment = () => {
  return inquirer.default.prompt([
    {
      type: 'list',
      name: 'environment',
      message: '请选择要上传的环境:',
      default: 'dev',
      choices: ['no', 'dev', 'test', 'release', 'prod'],
    },
  ])
}

const build = () => {
  selectEnvironment().then((answer) => {
    const develop = answer.environment
    const command = 'uni build -p app'
    // 1. 执行命令
    exec(command, { cwd: projectRoot }, (error, stdout, stderr) => {
      // uniapp 打包完成的回调
      if (error) {
        console.error(`执行命令时出错: ${error}`)
        return
      }
      // 2. 压缩 wgt 文件
      compress((outputPath, outputName) => {
        // 3. 上传服务器
        if (develop !== 'no') {
          ftpServer(outputPath, outputName, develop)
        }
      })
    })
  })
}
build()

标签:Node,uniapp,const,wgt,build,error,path,archive
From: https://blog.csdn.net/JoveTAT/article/details/141672249

相关文章

  • 基于SpringBoot+Vue+uniapp的EE的仓库管理系统设计与开发vue的详细设计和实现(源码+lw
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取源码获取前言......
  • 会员通知短信怎么利用NodeJS发送短信
    会员通知群发短信以其即时高效、高打开率、个性化定制、成本效益高、跨平台兼容以及法律合规等优势,在现代会员管理和营销策略中占据了重要地位。对于希望提升会员沟通效率、增强用户粘性和促进业务增长的企业而言,合理利用群发短信工具无疑是一个明智的选择。支持免费试用下乐......
  • win版本nodejs切换版本
    在Windows系统上,使用Node.js版本管理器nvm(NodeVersionManager)可以轻松切换Node.js版本。以下是安装和使用nvm的步骤:下载nvm安装器:访问https://github.com/coreybutler/nvm-windows/releases,下载最新的nvm-setup.zip文件。安装nvm:下载完成后,解压并运行nvm-setup.exe,按照向......
  • uniapp js 数独小游戏 9*9 数独 2.0
    效果图: game.vue<template> <view> <viewclass="main"> <viewclass="foot"> <viewv-if="!isTip"class="sudoku_area"> <viewv-for="(row,index)ofrowList":key=&quo......
  • uniapp js 数独小游戏 n*n 看控制台的打印 数独 1.0
    uniappjs 数独小游戏n*n 看控制台的打印game.vue<template> <view>4567</view></template><scriptsetuplang="ts">import{ref}from'vue'import{onShow}from'@dcloudio/uni-app'constsdNum=ref(......
  • 基于Node.js+vue社区医疗服务系统(程序+论文+开题报告)-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着社会老龄化的加剧和居民健康意识的提升,社区医疗服务作为连接居民与医疗资源的重要桥梁,其重要性与日俱增。然而,当前许多社区医疗服务存在资源分配不均、......
  • 基于Node.js+vue网课视频课设(程序+论文+开题报告)-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,特别是在全球疫情的影响下,线上教育成为了教育领域不可或缺的一部分,网课视频课程以其灵活便捷、资源丰富等优势迅速崛起。然而,当前......
  • 基于Node.js+vue社区常驻居民信息管理软件(程序+论文+开题报告)-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着城市化进程的加速,社区作为城市的基本单元,其管理效率与居民生活质量息息相关。然而,传统社区管理方式往往依赖于纸质档案和人工操作,存在信息更新不及时、......
  • 基于Node.js+vue外卖鲜花系统(程序+论文+开题报告)-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网的飞速发展和人们生活节奏的加快,线上消费已成为现代生活不可或缺的一部分,尤其是在追求即时满足与个性化体验的今天,传统鲜花行业正经历着深刻的变......
  • 基于Node.js+vue商城积分兑换系统(程序+论文+开题报告)-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景在电子商务蓬勃发展的今天,商城积分兑换系统作为增强用户粘性、促进用户复购的重要手段,越来越受到各大电商平台的重视。随着消费者购物行为的日益成熟和多样......