portable.mjs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import fs from "fs-extra";
  2. import path from "path";
  3. import AdmZip from "adm-zip";
  4. import { createRequire } from "module";
  5. import { getOctokit, context } from "@actions/github";
  6. const META = process.argv.includes("--meta"); // use Clash.Meta
  7. /// Script for ci
  8. /// 打包绿色版/便携版 (only Windows)
  9. async function resolvePortable() {
  10. if (process.platform !== "win32") return;
  11. const releaseDir = "./src-tauri/target/release";
  12. if (!(await fs.pathExists(releaseDir))) {
  13. throw new Error("could not found the release dir");
  14. }
  15. const zip = new AdmZip();
  16. zip.addLocalFile(path.join(releaseDir, "Clash Verge.exe"));
  17. zip.addLocalFile(path.join(releaseDir, "clash.exe"));
  18. zip.addLocalFolder(path.join(releaseDir, "resources"), "resources");
  19. const require = createRequire(import.meta.url);
  20. const packageJson = require("../package.json");
  21. const { version } = packageJson;
  22. const zipFile = `Clash.Verge_${version}_x64_portable.zip`;
  23. zip.writeZip(zipFile);
  24. console.log("[INFO]: create portable zip successfully");
  25. // push release assets
  26. if (process.env.GITHUB_TOKEN === undefined) {
  27. throw new Error("GITHUB_TOKEN is required");
  28. }
  29. const options = { owner: context.repo.owner, repo: context.repo.repo };
  30. const github = getOctokit(process.env.GITHUB_TOKEN);
  31. const { data: release } = await github.rest.repos.getReleaseByTag({
  32. ...options,
  33. tag: `v${version}`,
  34. });
  35. console.log(release.name);
  36. await github.rest.repos.uploadReleaseAsset({
  37. ...options,
  38. release_id: release.id,
  39. name: zipFile,
  40. data: zip.toBuffer(),
  41. });
  42. }
  43. /// 打包包含Clash.Meta的 (only Windows)
  44. async function resolvePortableMeta() {
  45. if (process.platform !== "win32") return;
  46. const releaseDir = "./src-tauri/target/release";
  47. if (!(await fs.pathExists(releaseDir))) {
  48. throw new Error("could not found the release dir");
  49. }
  50. const zip = new AdmZip();
  51. zip.addLocalFile(path.join(releaseDir, "Clash Verge.exe"));
  52. zip.addLocalFile(path.join(releaseDir, "clash.exe"));
  53. zip.addLocalFile(path.join(releaseDir, "clash-meta.exe"));
  54. zip.addLocalFolder(path.join(releaseDir, "resources"), "resources");
  55. const require = createRequire(import.meta.url);
  56. const packageJson = require("../package.json");
  57. const { version } = packageJson;
  58. const zipFile = `Clash.Verge.Meta_${version}_x64_portable.zip`;
  59. zip.writeZip(zipFile);
  60. console.log("[INFO]: create portable zip successfully");
  61. // push release assets
  62. if (process.env.GITHUB_TOKEN === undefined) {
  63. throw new Error("GITHUB_TOKEN is required");
  64. }
  65. const options = { owner: context.repo.owner, repo: context.repo.repo };
  66. const github = getOctokit(process.env.GITHUB_TOKEN);
  67. const { data: release } = await github.rest.repos.getReleaseByTag({
  68. ...options,
  69. tag: `v${version}`,
  70. });
  71. console.log(release.name);
  72. await github.rest.repos.uploadReleaseAsset({
  73. ...options,
  74. release_id: release.id,
  75. name: zipFile,
  76. data: zip.toBuffer(),
  77. });
  78. }
  79. if (META) resolvePortableMeta().catch(console.error);
  80. else resolvePortable().catch(console.error);