build-android.js 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // build-android.js 位于 .build/ 目录下
  2. const fs = require('fs');
  3. const path = require('path');
  4. const { execSync } = require('child_process');
  5. const { rmSync } = require('fs');
  6. const { exec } = require('cordova');
  7. // 读取 package.json 获取版本号
  8. const packageJson = require(path.join(__dirname, '..', 'package.json'));
  9. // 计算各路径
  10. const rootDir = path.join(__dirname, '..'); // 项目根目录
  11. const cordovaPrjDir = path.join(__dirname, 'dros'); // .build/dros
  12. const srcDir = path.join(rootDir, 'dist', 'h5'); // ../dist/h5
  13. const dstDir = path.join(cordovaPrjDir, 'www');
  14. rmSync('.build/dros', { recursive: true, force: true });
  15. // 做一些环境检查
  16. execSync('npx cordova --version', { stdio: 'inherit' });
  17. // 1. 在项目根目录执行 cordova create
  18. execSync('npx cordova create .build/dros zskk.dros dros', { cwd: rootDir, stdio: 'inherit' });
  19. // 2. 在 .build/dros 中执行 cordova platform add android
  20. execSync('npx cordova platform add android', { cwd: cordovaPrjDir, stdio: 'inherit' });
  21. // 3. 复制 dist/h5 → .build/dros/www
  22. fs.rmSync(dstDir, { recursive: true, force: true });
  23. fs.mkdirSync(dstDir, { recursive: true });
  24. function copy(src, dst) {
  25. const stat = fs.statSync(src);
  26. if (stat.isDirectory()) {
  27. fs.mkdirSync(dst, { recursive: true });
  28. for (const entry of fs.readdirSync(src)) {
  29. copy(path.join(src, entry), path.join(dst, entry));
  30. }
  31. } else {
  32. fs.copyFileSync(src, dst);
  33. }
  34. }
  35. copy(srcDir, dstDir);
  36. // 4. 安装白名单插件
  37. // execSync('npx cordova plugin add cordova-plugin-whitelist', { cwd: cordovaPrjDir, stdio: 'inherit' });
  38. // 5. 复制预配置好的config.xml
  39. fs.copyFileSync(path.join(__dirname, 'config.xml'), path.join(cordovaPrjDir, 'config.xml'));
  40. // 6. 在 .build/dros 中执行 cordova build android
  41. execSync('npx cordova build android --verbose', { cwd: cordovaPrjDir, stdio: 'inherit' });
  42. // 7. 重命名apk文件
  43. const version = packageJson.version;
  44. const pkg = 'dros';
  45. const src = path.join(__dirname, 'dros/platforms/android/app/build/outputs/apk/debug/app-debug.apk');
  46. const dst = path.join(__dirname, `dros/platforms/android/app/build/outputs/apk/debug/${pkg}-v${version}.apk`);
  47. fs.copyFileSync(src, dst);
  48. console.log(`✅ 已生成 ${dst}`);
  49. // 安装到连接的安卓设备(CI 环境跳过)
  50. if (process.env.CI !== 'true') {
  51. try {
  52. execSync(`adb install "${dst}"`, { stdio: 'inherit' });
  53. console.log(`✅ 已安装到安卓设备 ${dst}`);
  54. } catch (error) {
  55. console.warn('⚠️ ADB 安装失败,可能没有连接设备:', error.message);
  56. }
  57. } else {
  58. console.log('ℹ️ CI 环境,跳过 ADB 安装步骤');
  59. }
  60. // 8. 部署到服务器(可选)
  61. (async () => {
  62. if (process.env.DEPLOY_ANDROID === 'true') {
  63. console.log('\n📤 开始部署到服务器...');
  64. console.log('='.repeat(50));
  65. try {
  66. const { deployAndroidToServer } = require('./deploy-android-to-server');
  67. await deployAndroidToServer({
  68. privateKey: process.env.DEPLOY_KEY,
  69. host: process.env.DEPLOY_HOST,
  70. username: process.env.DEPLOY_USER,
  71. remotePath: process.env.DEPLOY_PATH,
  72. apkPath: dst,
  73. appVersion: version
  74. });
  75. console.log('='.repeat(50));
  76. console.log('✅ 部署完成!');
  77. } catch (error) {
  78. console.error('='.repeat(50));
  79. console.error('❌ 部署失败:', error.message);
  80. process.exit(1);
  81. }
  82. } else {
  83. console.log('\n💡 提示: 设置 DEPLOY_ANDROID=true 可自动部署到服务器');
  84. }
  85. })();