欢迎参与讨论,转载请注明出处。
本文转载自https://musoucrow.github.io/2017/12/07/dfq_building/
前言
最近开发中的游戏需要在Android手机上进行测试,但采用USB数据线连接主机进行文件替换的更新实在是太麻烦了。遂考虑整个远程更新的解决方案,在研究的过程中排除了开发APP(耗费时长)与内置热更新(LuaSocket遇到点问题),最终选择了现在的在手机上安装Git客户端的方案。
详解
首先我选用了PocketGit作为Android的Git客户端,它可以满足我的基本需求。(感谢Hs的提供)但是仅仅如此是不够的,事实上不可能直接使用工程所用的Git仓库作为测试使用,毕竟测试的提交是十分频繁的。于是我首先考虑到了在工程仓库上创建测试分支,但是这也不够舒适,因为各分支的文件情况是独立的,到了特定时刻还得考虑合并的事。且测试分支的提交也会影响节点视图的观赏性,所以我选择了专门开一个测试仓库,通过编写Python脚本以一键同步相关文件并commit,十分方便。
脚本的实现
以下为程序源码:
import os
import time
import shutil
import zipfile
def sync(path_a, path_b):
is_file_a = os.path.isfile(path_a)
is_file_b = os.path.isfile(path_b)
is_dir_a = os.path.isdir(path_a)
is_dir_b = os.path.isdir(path_b)
if is_file_a:
if is_dir_b:
shutil.rmtree(path_b, True)
if is_file_b:
time_a = os.stat(path_a).st_mtime
time_b = os.stat(path_b).st_mtime
if time_a != time_b:
shutil.copy2(path_a, path_b)
else:
shutil.copy2(path_a, path_b)
elif is_dir_a:
if is_file_b:
os.remove(path_b)
if is_dir_b:
list_a = os.listdir(path_a)
list_b = os.listdir(path_b)
list_merger = list(set(list_a + list_b))
for path in list_merger:
sync(path_a + "/" + path, path_b + "/" + path)
else:
shutil.copytree(path_a, path_b)
else:
if is_dir_b:
shutil.rmtree(path_b, True)
elif is_file_b:
os.remove(path_b)
def make_archive(path):
zip_file = zipfile.ZipFile(path, "w")
zip_file.write("conf.lua")
zip_file.write("main.lua")
zip_file.write("path.lua")
for root, dirs, files in os.walk("asset/font"):
for f in files:
zip_file.write(root + "/" + f)
zip_file.close()
sync("asset", "build/asset")
sync("config", "build/config")
sync("source", "build/source")
make_archive("build/game.love")
now_time = time.strftime("%Y-%m-%d-%H:%M:%S", time.localtime(time.time()))
os.system(
"""
cd build
git add .
git commit -m %s
""" % now_time
)
脚本的实现思路为将工程仓库下的三个文件夹与对应的测试仓库里的文件夹做对比,若工程仓库存在文件而测试仓库不存在,则复制之。若存在,则对比两者的最后修改日期,不一致则复制。(这里原本是考虑使用MD5检测文件完整性的,不过这将会影响到效率,发现在合理使用的前提下,只检测最后修改日期也无妨,遂采用)若出现测试仓库存在而工程仓库不存在的文件/文件夹,则删除之。
然后便是对某些关键文件进行打包为.love文件存放到测试仓库,它是LÖVE的可执行文件,但实际上只是个.zip文件。最后便是对测试仓库进行commit。
后记
然后如这般做好配置,便可在Android设备上克隆主机的测试仓库了(以局域网的形式)。
当然还得确保主机开启了ssh,在macOS下开启ssh的方式为:System Preferences → Sharing → Remote Login。