【uniapp】Uniapp cli 自动化打包脚本实现

这篇具有很好参考价值的文章主要介绍了【uniapp】Uniapp cli 自动化打包脚本实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

通常使用uniapp开发app时,大多数会使用项目的云服务打包,否则的话再借助原生会变得极其复杂,还要去安装对应大内存的环境。如果恰好此时,你有一个需求是,可以随意的更换logo和封面、标题切换成另外一个app,那么很明显你的HBuilderX维护起来是非常复杂的,如果我们想借助命令行打包命令动态打包该怎么做呢?

二、cli命令介绍

cli是HBuilderX给开发者提供可以通过cli命令行指示HBuilderX进行启动、打包、登录等操作。前提是你还是要有HBuilderX的应用,才能进行使用哦,官方链接

三、设计

  • 本地代码打包
  • 打包后的资源copy至本地项目
  • 本地资源进行替换
  • 本地代码进行打包
  • 取出云端的链接

四、核心实现过程

1.本地代码打包生成app资源代码

这里借助了child_processnpm插件方便我们执行cmd命令,cli是你的hbuilderx的cli命令的根位置,它可能是这样的 '/Applications/HBuilderX.app/Contents/MacOS/cli'

var {spawn} = require('child_process');
const {cli} = require('./../config/setting')
module.exports =  function(){
  return new Promise(async (resolve, reject) => {
    let resk = await spawn(cli, ['publish','--platform','APP','--type','appResource','--project','qxyuqing-app'])
    resk.on('close', async (code) => {
      console.log('[qxyuqing-app] app资源本地打包完成')
      resolve('success')
    })
  })
}
2.打包后的资源copy至本地项目
var {spawn,exec} = require('child_process');
const {cli,codeSource,uniId,codeTarget} =require('./../config/setting')
// codeSource 代码的地址
// uniId 项目分配Dcloud_AppId
// codeTarget 目标位置
module.exports = async function(callback){
  const pathUrl = new Promise((resolve, reject) => {
    spawn('pwd').stdout.on('data', (data) => {
      resolve(data.toString())
    })
  }) 
  let resUrl = await pathUrl
  resUrl = resUrl.replace(/\n/g, "");// 当前所在目录
  // 删除源码
  const args = ['-r',`${resUrl}/src/${codeTarget}`]
  let resk1 = await spawn('rm', args)
  resk1.on('close', async (code) => {
    console.log('delete old code success!')
    // copy源码到指令目录
    let resk2 = await spawn('cp', ['-r',`${codeSource}/${uniId}/www`,`${resUrl}/src`])
    resk2.on('close', async (code) => {
      console.log('copy success!')
      let resk3 = await spawn(cli, ['project','open','--path',`${resUrl}/src/${codeTarget}`])
      resk3.on('close', async (code) => {
        console.log('导入 hubildx success!')
        callback('success')
      })
    });
  });
}
3.本地资源进行替换

这里就是将app的logo,隐私协议、manifest.json、启动页进行更换文章来源地址https://www.toymoban.com/news/detail-764826.html

const { copyFiles, mergeJSONFiles,mergePngToZip,copyFileReplace } = require('./file')
const {codeTarget} = require('./../config/setting')

module.exports = function(node_env){
  return new Promise(async (resolve, reject) => {
    const folderA = `./config/${node_env}`
    const folderB = `./src/${codeTarget}`
    await copyFiles(`${folderA}/unpackage/res/icons`, `${folderB}/unpackage/res/icons`)
    console.log('logo替换完成!');
    // 替换logo oem默认配置
    // await copyFiles(`${folderA}/img/res/icons`, `${folderB}/unpackage/res/icons`)
    await copyFileReplace(`${folderA}/img/logo.png`,`${folderB}/static/logo.png`,'logo.png')
    await copyFileReplace(`${folderA}/img/index/logo.png`,`${folderB}/static/img/index/logo.png`,'logo.png')
    await copyFileReplace(`${folderA}/img/index/bj.png`,`${folderB}/static/img/index/bj.png`,'bj.png')
    await copyFileReplace(`${folderA}/img/videoSearch/searchLogo.png`,`${folderB}/static/img/videoSearch/searchLogo.png`,'searchLogo.png')
    console.log('oem资源替换完成!')
    // app名称、介绍配置替换
    await mergeJSONFiles(folderA,'androidPrivacy.json',folderB,'androidPrivacy.json')
    console.log('androidPrivacy隐私协议替换完成!');
    await mergeJSONFiles(folderA,'manifest.json',folderB,'manifest.json')
    console.log('app基础配置替换完成!');
    // ios替换 customStoryBoard 启动页
    await mergePngToZip(`${folderA}/iosCustomStoryBoard`,`${folderB}/static/CustomStoryboard`,`${folderB}/unpackage/CustomStoryboard.zip`)
    console.log('ios启动页替换完成!');
    // andriod 启动页更换
    await copyFileReplace(`${folderA}/iosCustomStoryBoard/dc_launchscreen_portrait_background@3x.png`,`${folderB}/static/yindao.png`,'yindao.png')
    resolve('success')
  })
}
4.本地代码进行打包
var {spawn,exec} = require('child_process');
const {cli,codeTarget} = require('./../config/setting')
module.exports = function(node_env){
  return new Promise(async (resolve, reject) => {
    const command = cli;
    const pathUrl = new Promise((resolve, reject) => {
      spawn('pwd').stdout.on('data', (data) => {
        console.log(`stdout: ${data}`);
        resolve(data.toString())
      })
    }) 
    let resUrl = await pathUrl
    resUrl = resUrl.replace(/\n/g, "");
    console.log(resUrl)
    const args = ['pack','--project',codeTarget, '--config', `${resUrl}/config/${node_env}/pca/configure.json`];
    const child = spawn(command, args);
    child.stdout.on('data', (data) => {
      console.log(`stdout: ${data}`);
      const regex = /(https?:\/\/[^\s]+)/g;
      const result = data.toString().match(regex);
      if(result){
        const downloadUrl = result.filter(item=>item.indexOf('/build/download')!=-1)
        if(downloadUrl.length>0){
          console.log('++++++++++++++++++++下载地址+++++++++++++++++++++++++++++++++++')
          console.log(downloadUrl[0])
          console.log('++++++++++++++++++++下载地址+++++++++++++++++++++++++++++++++++')
        }
      }
      if(data.toString().indexOf('是否继续提交')!=-1){
        console.log('重新提交')
      }
    });
  
    child.stderr.on('data', (data) => {
      console.error(`stderr: ${data}`);
      reject('err')
    });
  
    child.on('close', (code) => {
      console.log(`子进程退出码:${code}`);
      console.log("已完成");
      resolve('success')
    });
  })

到了这里,关于【uniapp】Uniapp cli 自动化打包脚本实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用 Python Nornir 实现基于 CLI 的网络自动化?

    在现代网络环境中,网络自动化已成为管理和配置网络设备的重要工具。Python Nornir 是一个强大的自动化框架,它提供了一个简单而灵活的方式来执行网络自动化任务。本文将详细介绍如何使用 Python Nornir 实现基于 CLI 的网络自动化。 Python Nornir 是一个开源的 Python 框架,专门

    2024年02月07日
    浏览(40)
  • 使用 vve-i18n-cli 来一键式自动化实现国际化

    【Github:vue-viewer-editor/vve-i18n-cli】 这是我同事开发的国际化自动处理脚本,我进行过一次扩展,让其也支持我们一个 jQuery 老项目的国际化日常维护 至此,我们团队内的国际化均是使用该脚本来进行日常维护 该自动化脚本极大的为我们提效,基本将国际化的词条相关工作降

    2024年02月03日
    浏览(32)
  • [Python自动化]使用Python Pexpect模块实现自动化交互脚本使用心得

    参考文档:https://pexpect.readthedocs.io/en/stable/ 在最近的工作中,需要使用DockerFile构建镜像。在构建镜像的过程中,有一些执行的命令是需要交互的。例如安装 tzdata (apt install tzdata),不过在使用apt安装时,可以直接使用 DEBIAN_FRONTEND=noninteractive 前缀来取消交互(至于是禁止交互还

    2023年04月25日
    浏览(48)
  • selenium IDE自动化测试脚本的实现

    Selenium IDE   是一个简单的录制回放工具,它可以录制你在浏览器上的操作,回放脚本时,它可以重现录制的动作,就好像你又操作了一遍一样。  selenium IDE是个浏览器插件,你需要在浏览器上安装该插件才能使用。 1.下载chrome或者firefox浏览器的插件。 下载路径:Selenium IDE

    2024年02月03日
    浏览(61)
  • Apache DolphinScheduler 如何实现自动化打包+单机/集群部署?

    Apache DolphinScheduler 是一款开源的分布式任务调度系统,旨在帮助用户实现复杂任务的自动化调度和管理。DolphinScheduler 支持多种任务类型,可以在单机或集群环境下运行。下面将介绍如何实现 DolphinScheduler 的自动化打包和单机/集群部署。 所需环境:maven、jdk 执行以下shell完成

    2024年02月09日
    浏览(38)
  • 云计算的自动化与脚本:实现高效运维

    云计算是一种基于互联网和服务器集群的计算模式,它允许用户在需要时从任何地方访问计算资源。自动化和脚本在云计算中发挥着至关重要的作用,因为它们可以帮助管理员更高效地运行和维护云计算环境。在本文中,我们将探讨云计算自动化和脚本的核心概念、算法原理

    2024年04月12日
    浏览(45)
  • 使用Python+selenium实现第一个自动化测试脚本

    这篇文章主要介绍了使用Python+selenium实现第一个自动化测试脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 最近在学web自动化,记录一下学习过程。 此处我选用python3.6+selenium3.0,均用

    2024年02月03日
    浏览(60)
  • 通过Appium Desktop实现录制功能并导出自动化脚本

    1、我们进入下面这个界面  图中红色标记1为 “ top by coordinates ” 按钮, 这是一种通过坐标定位元素的方式。  图中红色标记2为 “ Start Recording ” 按钮, 选中表示处理录制状态。   2、点击“top by coordinates” 按钮,再点击 “Start Recording” 按钮,我们就可以在左则的 App 界

    2024年02月08日
    浏览(46)
  • QT+jenkins window环境实现一键自动化构建打包签名发布

            1.官网下载地址: Jenkins download and deployment,下载最新版本的安装包并安装。安装过程中,会要求你输入端口号并记住。         2.java下载地址:Java Downloads | Oracle,下载最新版本的安装包并安装。         3.浏览器输入网址:127.0.0.1: port, port为端口号,默认8080,安

    2024年02月01日
    浏览(45)
  • Python键盘监听:实现快捷操作和自动化脚本(监听组合键

    本文主要介绍一下使用Python进行事件监听功能,以实现一些特有的操作。本文旨在介绍如何实现这一功能。 笔者根据一些需求写了一个小工具,流程和功能如下图所示(实际功能有更多): 该工具主要实现了 键盘监听 和 鼠标连击; 通过键盘监听事件去驱动 鼠标做一些操作

    2024年02月13日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包