前言
我已经在mac上搭建了一套自动化打包流程,但是是用的sh,首先无法跨平台,其次成本比较高(穷~),借鉴python等工具,构思了一下从自己熟悉的js语言重构这套流程,目前已基本实现打包流程的自动化.
听闻官方也准备有个集成的热更方案,也许此教程不久就没什么价值了~
准备
- 操作系统: windows/mac
因为cocos官方没有支持linus构建,所以如果想用linux需要先在windows或mac上先构建,然后继续下面的步骤(为什么要多此一举,同时希望官方能尽快支持linux构建)
技术栈
- nodejs – 必须
- python – 非必须 如果需要使用到腾讯cos则需要会安装
- jenkins – 如果想自动触发,则理论必须
构建原理
命令行构建
- CCC支持命令行构建:参考官方文档 命令行发布项目
- AndroidStudio 提供了gradlew命令行构建脚本
构建步骤
如果只是构建web平台,那么看完文档安装好jenkins理论上整个流程就可以完成,我这边主要是原生工程的构建,主要是以下几个步骤:
- 构建项目
- 制作更新包
- 打包原生工程
Node命令
- nodejs可以通过
require("child_process").exec
命令执行sh或cmd命令 - cos支持cmd上传,SDK文档
主要流程
构建项目
我们在项目目录下,新建一个目录,自定义即可,主要是配置一些基础参数,第一版考虑的JSON配置,但是不能加注释,比较麻烦,所以第二版,改成了yaml文件,配置如下:
1 | // 每次打包可能都需要配置的位置 |
据此,先写出构建的cmd命令
1 | let cmd = |
最后一行的配置我是写死的,如果有需要,都可以放到配置中。
因为mac和windows路径是不同的,所以要区分下目录,比如
1 | if (utils.isMac()) { |
根据版本配置,也可以通过每次打包备份原版本,然后比较代码,判断是否进行构建,比如
1 | if (utils.compareVersion(config.clientVer, backConfig.clientVer || '0')) { |
utils.runSh(cmd);
1 |
|
// 复制文件到当前文件夹
const src = mfs.join(buildPath, 'src');
const res = mfs.join(buildPath, 'res');
const subpackages = mfs.join(buildPath, 'subpackages');
const dirPath = mfs.join(packPath, dirName);
mfs.cp(src, mfs.join(dirPath, 'src'));
mfs.cp(res, mfs.join(dirPath, 'res'));
mfs.cp(subpackages, mfs.join(dirPath, 'subpackages'));
1 | 注意,每个版本的目录形式不一致,需要自行做出一定的修改 |
let manifest = {};
const dirInfo = mfs.parse(config.dirPath);
manifest.packageUrl = url + '/' + dirInfo.base + '/';
manifest.remoteManifestUrl = manifest.packageUrl + 'project.manifest';
manifest.remoteVersionUrl = manifest.packageUrl + 'version.manifest';
manifest.version = config.version;
const destVersion = mfs.join(config.dirPath, 'version.manifest');
mfs.writeFile(destVersion, JSON.stringify(manifest, null, 4));// 写入基本信息到version.manifest
manifest.assets = {};
const paths = mfs.readDir(config.dirPath);
let manifestPath = '';
paths.forEach(filePath => {
const relative = encodeURI(mfs.relative(config.dirPath, filePath).replace(/\\/g, '/'));
if (mfs.extname(filePath) === '.manifest') { // manifest 不进行更新
manifestPath = relative;
return;
}
manifest.assets[relative] = {
size: mfs.size(filePath),
md5: utils.md5(mfs.readFile(filePath, 'binary'))
};
const compressed = mfs.extname(filePath).toLowerCase() === '.zip';
if (compressed) {
manifest.assets[relative].compressed = true;
}
});
const destManifest = mfs.join(config.dirPath, 'project.manifest');
mfs.writeFile(destManifest, JSON.stringify(manifest, null, 0));
return {
manifest: manifest,
path: manifestPath
}
1 |
|
const destManifest = mfs.join(buildPath, info.path);
mfs.writeFile(destManifest, JSON.stringify(info.manifest, null, 0));
const cmd = 'coscmd upload -r ' + dirPath + ' ' + cosPath;
utils.runSh(cmd).then(() => {
console.log('上传成功');
backConfig.clientVer = config.clientVer;
pack();
}).catch(() => {
console.log('上传cos失败');
});
1 | 热更步骤,相对简单,如上就完成了热更打包,更新以及上传到cos。 |
utils.execFile('gradlew.bat', [':' + config.title + ':assembleRelease'], { cwd: config.androidPath }, (error, stdout, stderr) => {
if (error) {
console.log('error', error);
reject();
} else {
console.log('执行成功');
resolve();
}
});
- 如果发现该命令卡住,可以手动到android目录下执行gradlew命令查看原因,大部分情况是在下载gradle
## 执行
1. 请确保已经安装jenkins(一步步next即可)
2. 配置好git/svn/网址触发方式(请自行百度教程)
3. 修改config的版本号,提交git或请求网址即可。
一些命令都被我封装了,包含但不仅仅包含:文件处理相关、执行cmd等,完整代码,请关注公众号【xyzzlky】回复AutoPack 获取。
原文链接: https://blog.xyzzlky.cn/page/23/index.html
版权声明: 转载请注明出处.