portable.mjs 3.1 KB

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