From aa0964e2c1ac93e52bf29e5ff39d0cf5bfef0c68 Mon Sep 17 00:00:00 2001 From: Tw93 Date: Fri, 23 Jun 2023 18:12:10 +0800 Subject: [PATCH] :art: Fix the packaging issue for Linux and Windows --- bin/builders/BaseBuilder.ts | 40 ++++++++++---------- bin/builders/LinuxBuilder.ts | 28 +++++++------- bin/builders/MacBuilder.ts | 9 +---- bin/builders/WinBuilder.ts | 11 +----- dist/cli.js | 72 +++++++++++++++++------------------- package.json | 2 +- 6 files changed, 72 insertions(+), 90 deletions(-) diff --git a/bin/builders/BaseBuilder.ts b/bin/builders/BaseBuilder.ts index 5d78aff..e1c7aed 100644 --- a/bin/builders/BaseBuilder.ts +++ b/bin/builders/BaseBuilder.ts @@ -57,50 +57,50 @@ export default abstract class BaseBuilder { spinner.succeed('Package installed.'); } - async buildAndCopy(url: string) { + async build(url: string) { + await this.buildAndCopy(url, this.options.targets); + } + + async buildAndCopy(url: string, target: string) { const { name } = this.options; await mergeConfig(url, this.options, tauriConfig); - await this.runBuildCommand(); + // Build app + const spinner = getSpinner('Building app...'); + setTimeout(() => spinner.stop(), 3000); + await shellExec(`cd ${npmDirectory} && ${this.getBuildCommand()}`); + + // Copy app const fileName = this.getFileName(); - const appPath = this.getBuildAppPath(npmDirectory, fileName); - const distPath = path.resolve(`${name}.${this.getExtension()}`); + const fileType = this.getFileType(target); + const appPath = this.getBuildAppPath(npmDirectory, fileName, fileType); + const distPath = path.resolve(`${name}.${fileType}`); await fsExtra.copy(appPath, distPath); await fsExtra.remove(appPath); logger.success('โœ” Build success!'); logger.success('โœ” App installer located in', distPath); } - abstract build(url: string): Promise; + protected getFileType(target: string): string { + return target.toLowerCase(); + } abstract getFileName(): string; - abstract getExtension(): string; - - protected getArch() { - return process.arch === "x64" ? "amd64" : process.arch; - } - protected getBuildCommand(): string { return "npm run build"; } - protected runBuildCommand() { - const spinner = getSpinner('Building app...'); - setTimeout(() => spinner.stop(), 3000); - return shellExec(`cd ${npmDirectory} && ${this.getBuildCommand()}`); - } - protected getBasePath(): string { return 'src-tauri/target/release/bundle/'; } - protected getBuildAppPath(npmDirectory: string, fileName: string): string { + protected getBuildAppPath(npmDirectory: string, fileName: string, fileType: string): string { return path.join( npmDirectory, this.getBasePath(), - this.getExtension().toLowerCase(), - `${fileName}.${this.getExtension()}` + fileType, + `${fileName}.${fileType}` ); } } diff --git a/bin/builders/LinuxBuilder.ts b/bin/builders/LinuxBuilder.ts index ffac65f..25737a4 100644 --- a/bin/builders/LinuxBuilder.ts +++ b/bin/builders/LinuxBuilder.ts @@ -3,29 +3,31 @@ import { PakeAppOptions } from '@/types'; import tauriConfig from '@/helpers/tauriConfig'; export default class LinuxBuilder extends BaseBuilder { + constructor(options: PakeAppOptions) { super(options); } + getFileName(): string { + const { name } = this.options; + const arch = process.arch === "x64" ? "amd64" : process.arch; + return `${name}_${tauriConfig.package.version}_${arch}`; + } + + // Customize it, considering that there are all targets. async build(url: string) { - const targetTypes = ['deb', 'appimage']; - for (const type of targetTypes) { - if (this.options.targets === type || this.options.targets === "all") { - await this.buildAndCopy(url); + const targetTypes = ["deb", "appimage"]; + for (const target of targetTypes) { + if (this.options.targets === target || this.options.targets === "all") { + await this.buildAndCopy(url, target); } } } - getFileName(): string { - const { name } = this.options; - const arch = this.getArch(); - return `${name}_${tauriConfig.package.version}_${arch}`; - } - - getExtension(): string { - if (this.options.targets === 'appimage') { + protected getFileType(target: string): string { + if (target === 'appimage') { return 'AppImage'; } - return this.options.targets; + return super.getFileType(target); } } diff --git a/bin/builders/MacBuilder.ts b/bin/builders/MacBuilder.ts index 8958787..d0441d8 100644 --- a/bin/builders/MacBuilder.ts +++ b/bin/builders/MacBuilder.ts @@ -5,10 +5,7 @@ import BaseBuilder from './BaseBuilder'; export default class MacBuilder extends BaseBuilder { constructor(options: PakeAppOptions) { super(options); - } - - async build(url: string) { - await this.buildAndCopy(url); + this.options.targets = "dmg"; } getFileName(): string { @@ -22,10 +19,6 @@ export default class MacBuilder extends BaseBuilder { return `${name}_${tauriConfig.package.version}_${arch}`; } - getExtension(): string { - return "dmg"; - } - protected getBuildCommand(): string { return this.options.multiArch ? 'npm run build:mac' : super.getBuildCommand(); } diff --git a/bin/builders/WinBuilder.ts b/bin/builders/WinBuilder.ts index 706dea5..c4ca2a1 100644 --- a/bin/builders/WinBuilder.ts +++ b/bin/builders/WinBuilder.ts @@ -5,20 +5,13 @@ import tauriConfig from '@/helpers/tauriConfig'; export default class WinBuilder extends BaseBuilder { constructor(options: PakeAppOptions) { super(options); - } - - async build(url: string) { - await this.buildAndCopy(url); + this.options.targets = "msi"; } getFileName(): string { const { name } = this.options; - const arch = this.getArch(); + const { arch } = process; const language = tauriConfig.tauri.bundle.windows.wix.language[0]; return `${name}_${tauriConfig.package.version}_${arch}_${language}`; } - - getExtension(): string { - return "msi"; - } } diff --git a/dist/cli.js b/dist/cli.js index 00f186b..e7dfa79 100644 --- a/dist/cli.js +++ b/dist/cli.js @@ -20,7 +20,7 @@ import isUrl from 'is-url'; import fs from 'fs'; var name = "pake-cli"; -var version = "2.1.2"; +var version = "2.1.3"; var description = "๐Ÿคฑ๐Ÿป Turn any webpage into a desktop app with Rust. ๐Ÿคฑ๐Ÿป ๅพˆ็ฎ€ๅ•็š„็”จ Rust ๆ‰“ๅŒ…็ฝ‘้กต็”Ÿๆˆๅพˆๅฐ็š„ๆกŒ้ข Appใ€‚"; var engines = { node: ">=16.0.0" @@ -654,43 +654,44 @@ class BaseBuilder { } spinner.succeed('Package installed.'); } - async buildAndCopy(url) { + async build(url) { + await this.buildAndCopy(url, this.options.targets); + } + async buildAndCopy(url, target) { const { name } = this.options; await mergeConfig(url, this.options, tauriConfig); - await this.runBuildCommand(); + // Build app + const spinner = getSpinner('Building app...'); + setTimeout(() => spinner.stop(), 3000); + await shellExec(`cd ${npmDirectory} && ${this.getBuildCommand()}`); + // Copy app const fileName = this.getFileName(); - const appPath = this.getBuildAppPath(npmDirectory, fileName); - const distPath = path.resolve(`${name}.${this.getExtension()}`); + const fileType = this.getFileType(target); + const appPath = this.getBuildAppPath(npmDirectory, fileName, fileType); + const distPath = path.resolve(`${name}.${fileType}`); await fsExtra.copy(appPath, distPath); await fsExtra.remove(appPath); logger.success('โœ” Build success!'); logger.success('โœ” App installer located in', distPath); } - getArch() { - return process.arch === "x64" ? "amd64" : process.arch; + getFileType(target) { + return target.toLowerCase(); } getBuildCommand() { return "npm run build"; } - runBuildCommand() { - const spinner = getSpinner('Building app...'); - setTimeout(() => spinner.stop(), 3000); - return shellExec(`cd ${npmDirectory} && ${this.getBuildCommand()}`); - } getBasePath() { return 'src-tauri/target/release/bundle/'; } - getBuildAppPath(npmDirectory, fileName) { - return path.join(npmDirectory, this.getBasePath(), this.getExtension().toLowerCase(), `${fileName}.${this.getExtension()}`); + getBuildAppPath(npmDirectory, fileName, fileType) { + return path.join(npmDirectory, this.getBasePath(), fileType, `${fileName}.${fileType}`); } } class MacBuilder extends BaseBuilder { constructor(options) { super(options); - } - async build(url) { - await this.buildAndCopy(url); + this.options.targets = "dmg"; } getFileName() { const { name } = this.options; @@ -703,9 +704,6 @@ class MacBuilder extends BaseBuilder { } return `${name}_${tauriConfig.package.version}_${arch}`; } - getExtension() { - return "dmg"; - } getBuildCommand() { return this.options.multiArch ? 'npm run build:mac' : super.getBuildCommand(); } @@ -719,43 +717,39 @@ class MacBuilder extends BaseBuilder { class WinBuilder extends BaseBuilder { constructor(options) { super(options); - } - async build(url) { - await this.buildAndCopy(url); + this.options.targets = "msi"; } getFileName() { const { name } = this.options; - const arch = this.getArch(); + const { arch } = process; const language = tauriConfig.tauri.bundle.windows.wix.language[0]; return `${name}_${tauriConfig.package.version}_${arch}_${language}`; } - getExtension() { - return "msi"; - } } class LinuxBuilder extends BaseBuilder { constructor(options) { super(options); } + getFileName() { + const { name } = this.options; + const arch = process.arch === "x64" ? "amd64" : process.arch; + return `${name}_${tauriConfig.package.version}_${arch}`; + } + // Customize it, considering that there are all targets. async build(url) { - const targetTypes = ['deb', 'appimage']; - for (const type of targetTypes) { - if (this.options.targets === type || this.options.targets === "all") { - await this.buildAndCopy(url); + const targetTypes = ["deb", "appimage"]; + for (const target of targetTypes) { + if (this.options.targets === target || this.options.targets === "all") { + await this.buildAndCopy(url, target); } } } - getFileName() { - const { name } = this.options; - const arch = this.getArch(); - return `${name}_${tauriConfig.package.version}_${arch}`; - } - getExtension() { - if (this.options.targets === 'appimage') { + getFileType(target) { + if (target === 'appimage') { return 'AppImage'; } - return this.options.targets; + return super.getFileType(target); } } diff --git a/package.json b/package.json index a65e22f..c4c7839 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pake-cli", - "version": "2.1.2", + "version": "2.1.3", "description": "๐Ÿคฑ๐Ÿป Turn any webpage into a desktop app with Rust. ๐Ÿคฑ๐Ÿป ๅพˆ็ฎ€ๅ•็š„็”จ Rust ๆ‰“ๅŒ…็ฝ‘้กต็”Ÿๆˆๅพˆๅฐ็š„ๆกŒ้ข Appใ€‚", "engines": { "node": ">=16.0.0"