前言:若读者对热更新的基础知识点还不太了解,请先读上一篇
cocos2dx-lua 热更新基础详解_ellis1970的博客-CSDN博客
先介绍下热更新准备工作产出的版本控制文件,分为 版本号文件versionCheck.json(控制是否热更)和md5文件versionAsset.json(控制更新内容)
在开发热更新的过程中,首先要做的不是lua编码,而是生成下载目录和版本文件,本文介绍操作步骤和提供脚本代码
1.在src同级目录下创建create_version.bat
@echo off
rd /s/q serverHot
mkdir serverHot
mkdir serverHot\src
mkdir serverHot\res
start /wait cocos luacompile -s %~dp0\src -d %~dp0\serverHot\src --disable-compile
start /wait cocos luacompile -s %~dp0\res -d %~dp0\serverHot\res --disable-compile
python D:\projectDir\create_version.py
pause
2.在src同级目录下创建create_version.py
# -*- coding: UTF-8 -*-
import shutil
import os
import re
import platform
import subprocess
import zipfile
import hashlib
import json
projectDir = "D:/yourProjectPath" #src和res所在目录
ignoreDir = ["Default"]
num = 0
versionfileCheck = "versionCheck.json"
versionfileAsset = "versionAsset.json"
luaFiles = []
info1 = {}
info1["GameVersion"] = "100.1000"
info2 = {}
info2["assets"] = {}
def joinDir(root, dirs):
root = os.path.join(root, dirs) #把目录和文件名合成一个路径
return root
def copyres(path, luaRoot):
modulename = path[len(luaRoot) + 1 : len(path)] #modulename:source文件相对目录
outroot = luaRoot + "\\serverHot\\" +modulename #outroot:dest文件全路径
num = outroot.rfind("\\")
outrootdir = outroot[0:num + 1] #outrootdir:dest文件所在全路径目录
print(modulename +" /// " + outroot +" /// "+ outrootdir)
if not os.path.exists(outrootdir):
os.makedirs(outrootdir)
if path.endswith(".lua") or path.endswith("versionAsset.json") or path.endswith("versionCheck.json") or path.endswith("LuaDebugjit.lua"):
print("********* not copy:" + path)
else:
print("copying " + path)
shutil.copyfile(path, outroot)
return ""
def listDir(d):
global luaFiles
for item in os.listdir(d): # os.listDir:返回path指定的文件夹包含的文件或文件夹的名字的列表
nDir = joinDir(d, item)
if os.path.isfile(nDir):
luaFiles.append(nDir)
else:
listDir(nDir)
def packageScript(projectDir):
global luaFiles
luaRoot = joinDir(projectDir, "src") #取src全路径
luaRoot2 = joinDir(projectDir, "res") #取res全路径
print(luaRoot)
print(luaRoot2)
listDir(luaRoot) #取src文件列表
listDir(luaRoot2) #取res文件列表
for item in luaFiles:
zfile = copyres(item, projectDir) #item为文件全路径
def getMD5(root):
global num
files = os.listdir(root)
for f in files:
itemPath = joinDir(root, f)
if os.path.isdir(itemPath):
if (f[0] == '.' or (f in ignoreDir)):
pass
else:
getMD5(itemPath)
elif os.path.isfile(itemPath):
if f[0] != '.' and f != versionfileCheck and f != versionfileAsset:
fp = open(itemPath, 'rb')
m5 = hashlib.md5()
m5.update(fp.read())
fp.close()
name = itemPath[(len(projectDir + "\\serverHot") + 1):]
if os.sep == '\\':
name = re.sub('\\\\','/',name)
aMd5 = m5.hexdigest()
aSize = os.path.getsize(itemPath)
info2['assets'][name]=[aMd5, aSize]
print("getMD5====>" + itemPath + " md5: " + m5.hexdigest())
num = num + 1
packageScript(projectDir) #遍历src和res文件夹,除了lua文件的其他文件复制到serverHot中
getMD5(projectDir + "\\serverHot") #遍历serverHot里面的src和res文件夹,生成md5码,放到全局变量info2中
jsonStr1 = json.dumps(info1)
fp = open(joinDir(projectDir + "\\serverHot\\res", versionfileCheck), "wb")
fp.write(jsonStr1)
print("========= versionCheck.json complete =========")
jsonStr2 = json.dumps(info2)
fp = open(joinDir(projectDir + "\\serverHot\\res", versionfileAsset), "wb")
fp.write(jsonStr2)
print("========= versionAsset.json complete =========")
fp.close()
print("========= end =========")
3.操作步骤:双击create_version.bat,在弹出的cmd执行好之后关闭,在中止批处理操作对话中输入n,重复2次等待python执行完成
等待脚本执行完成,注意需要保证文件的名字和路径没有中文名,不然会报错
4.生成结果介绍
将服务器执行程序放到serverHot下
生成的版控文件在res下
5.确定本地版本文件和下载目录
5.1 将serverhot/res下的versionCheck.json和versionAsset.json放到你自己项目的res下,作为项目的本地版控文件
5.2 改动你项目src和res里面的内容后当做新的版本,再重复步骤1-3,生成服务器的下载目录和版本文件
5.3 操作完成后,将服务器版本号改为"100.1001"后,运行服务器启动程序NetBox2.exe(也可以使用其他的,读者可自行选择)。
到这里你的准备工作已经完成,待完成Lua代码开发后(请见下一篇),就可以做热更新测试了。