Skip to content

Commit 223a6aa

Browse files
committed
fix: snap support, desktop integration attempt #509
1 parent 6a177a6 commit 223a6aa

File tree

5 files changed

+33
-28
lines changed

5 files changed

+33
-28
lines changed

src/platformPackager.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,4 +635,8 @@ export async function getResolvedPublishConfig(packager: BuildInfo, publishConfi
635635
else {
636636
return null
637637
}
638+
}
639+
640+
export function toDebArch(arch: Arch) {
641+
return arch === Arch.ia32 ? "i386" : "amd64"
638642
}

src/targets/LinuxTargetHelper.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,10 @@ export class LinuxTargetHelper {
6767
return options.description || this.packager.appInfo.description
6868
}
6969

70-
async computeDesktopEntry(platformSpecificBuildOptions: LinuxBuildOptions, exec?: string, extra?: { [key: string]: string; }): Promise<string> {
70+
async computeDesktopEntry(platformSpecificBuildOptions: LinuxBuildOptions, exec?: string, destination?: string | null, extra?: { [key: string]: string; }): Promise<string> {
7171
const appInfo = this.packager.appInfo
7272

7373
const productFilename = appInfo.productFilename
74-
const tempFile = await this.packager.getTempFile(`${productFilename}.desktop`)
7574

7675
const desktopMeta: any = Object.assign({
7776
Name: appInfo.productName,
@@ -80,6 +79,7 @@ export class LinuxTargetHelper {
8079
Terminal: "false",
8180
Type: "Application",
8281
Icon: appInfo.name,
82+
StartupWMClass: `"${productFilename}"`,
8383
}, extra, platformSpecificBuildOptions.desktop)
8484

8585
const category = platformSpecificBuildOptions.category
@@ -94,6 +94,7 @@ export class LinuxTargetHelper {
9494
}
9595
data += "\n"
9696

97+
const tempFile = destination || await this.packager.getTempFile(`${productFilename}.desktop`)
9798
await outputFile(tempFile, data)
9899
return tempFile
99100
}

src/targets/appImage.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export default class AppImageTarget extends Target {
2525

2626
// we add X-AppImage-BuildId to ensure that new desktop file will be installed
2727
this.desktopEntry = BluebirdPromise.promisify(uuid1)({mac: false})
28-
.then(uuid => helper.computeDesktopEntry(this.options, "AppRun", {
28+
.then(uuid => helper.computeDesktopEntry(this.options, "AppRun", null, {
2929
"X-AppImage-Version": `${packager.appInfo.buildVersion}`,
3030
"X-AppImage-BuildId": uuid,
3131
}))
@@ -65,7 +65,7 @@ export default class AppImageTarget extends Target {
6565
args.push("-zisofs", `level=${packager.devMetadata.build.compression === "store" ? "0" : "9"}:block_size=128k:by_magic=off`)
6666
args.push("set_filter_r", "--zisofs", "/")
6767

68-
await exec(process.env.USE_SYSTEM_FPM === "true" || process.arch !== "x64" ? "xorriso" : path.join(appImagePath, "xorriso"), args)
68+
await exec(process.arch === "x64" ? path.join(appImagePath, "xorriso") : "xorriso", args)
6969

7070
await new BluebirdPromise((resolve, reject) => {
7171
const rd = createReadStream(path.join(appImagePath, arch === Arch.ia32 ? "32" : "64", "runtime"))
@@ -87,6 +87,6 @@ export default class AppImageTarget extends Target {
8787

8888
await chmod(resultFile, "0755")
8989

90-
packager.dispatchArtifactCreated(resultFile, packager.generateName("AppImage", arch, true))
90+
packager.dispatchArtifactCreated(resultFile)
9191
}
9292
}

src/targets/snap.ts

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,20 @@
1-
import { Target } from "../platformPackager"
1+
import { Target, toDebArch } from "../platformPackager"
22
import { Arch } from "../metadata"
33
import { LinuxTargetHelper } from "./LinuxTargetHelper"
44
import { LinuxPackager } from "../linuxPackager"
55
import { log } from "../util/log"
66
import { SnapOptions } from "../options/linuxOptions"
7-
import { emptyDir, writeFile } from "fs-extra-p"
7+
import { emptyDir, writeFile, rename, copy } from "fs-extra-p"
88
import * as path from "path"
99
import { safeDump } from "js-yaml"
10-
import { spawn, unlinkIfExists } from "../util/util"
10+
import { spawn } from "../util/util"
1111
import { homedir } from "os"
1212

1313
export default class SnapTarget extends Target {
1414
private readonly options: SnapOptions = Object.assign({}, this.packager.platformSpecificBuildOptions, (<any>this.packager.devMetadata.build)[this.name])
15-
private readonly desktopEntry: Promise<string>
1615

1716
constructor(private packager: LinuxPackager, private helper: LinuxTargetHelper, private outDir: string) {
1817
super("snap")
19-
20-
// we add X-AppImage-BuildId to ensure that new desktop file will be installed
21-
this.desktopEntry = helper.computeDesktopEntry(this.options, "AppRun")
2218
}
2319

2420
async build(appOutDir: string, arch: Arch): Promise<any> {
@@ -28,8 +24,8 @@ export default class SnapTarget extends Target {
2824
const appInfo = packager.appInfo
2925
const options = this.options
3026

31-
const resultFile = path.join(this.outDir, packager.generateName("snap", arch, true))
32-
await unlinkIfExists(resultFile)
27+
const snapDir = `${appOutDir}-snap`
28+
await emptyDir(snapDir)
3329

3430
const snap: any = {}
3531
snap.name = packager.executableName
@@ -39,15 +35,19 @@ export default class SnapTarget extends Target {
3935
snap.confinement = options.confinement || "strict"
4036
snap.grade = options.grade || "stable"
4137

38+
await this.helper.icons
39+
if (this.helper.maxIconPath != null) {
40+
snap.icon = "setup/gui/icon.png"
41+
await copy(this.helper.maxIconPath, path.join(snapDir, "setup", "gui", "icon.png"))
42+
}
43+
4244
if (options.assumes != null) {
4345
if (!Array.isArray(options.assumes)) {
4446
throw new Error("snap.assumes must be an array of strings")
4547
}
4648
snap.assumes = options.assumes
4749
}
4850

49-
const snapDir = `${appOutDir}-snap`
50-
5151
snap.apps = {
5252
[snap.name]: {
5353
command: `desktop-launch $SNAP/${packager.executableName}`,
@@ -57,29 +57,26 @@ export default class SnapTarget extends Target {
5757
}
5858
}
5959

60+
await this.helper.computeDesktopEntry(this.options, "$snap.$app", path.join(snapDir, "setup", "gui", `${snap.name}.desktop`), {
61+
"Icon": "${SNAP}/meta/gui/icon.png"
62+
})
63+
6064
const isUseDocker = process.platform !== "linux"
6165
snap.parts = {
6266
app: {
6367
plugin: "dump",
6468
"stage-packages": ["libappindicator1", "libdbusmenu-glib4", "libnotify4", "libunity9", "libgconf-2-4", "libnss3", "libxss1", "fontconfig-config", "libnotify-bin"],
6569
source: isUseDocker ? `/out/${path.basename(snapDir)}` : appOutDir,
6670
filesets: {
67-
app: [`${appOutDir}/*`]
71+
app: [`${appOutDir}/*`],
6872
},
6973
after: ["desktop-glib-only"]
7074
}
7175
}
7276

7377
const snapcraft = path.join(snapDir, "snapcraft.yaml")
74-
await emptyDir(snapDir)
7578
await writeFile(snapcraft, safeDump(snap))
7679

77-
// await writeFile(path.join(snapDir, "wrapper"), `
78-
// #!/bin/bash
79-
// unset XDG_CONFIG_DIRS
80-
// exec $SNAP/${packager.executableName}
81-
// `)
82-
8380
// const args = ["snapcraft", path.relative(snapDir)]
8481
// snap /out/${path.basename(snapDir)} --output /out/${path.basename(resultFile)}
8582
if (isUseDocker) {
@@ -100,6 +97,9 @@ export default class SnapTarget extends Target {
10097
})
10198
}
10299

103-
packager.dispatchArtifactCreated(resultFile, packager.generateName("snap", arch, true))
100+
const snapName = `${snap.name}_${snap.version}_${toDebArch(arch)}.snap`
101+
const resultFile = path.join(this.outDir, snapName)
102+
await rename(path.join(snapDir, snapName), resultFile)
103+
packager.dispatchArtifactCreated(resultFile)
104104
}
105105
}

yarn.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1155,9 +1155,9 @@ electron-download-tf@3.1.0:
11551155
semver "^5.3.0"
11561156
sumchecker "^1.2.0"
11571157

1158-
electron-macos-sign@1.3.2:
1159-
version "1.3.2"
1160-
resolved "https://registry.yarnpkg.com/electron-macos-sign/-/electron-macos-sign-1.3.2.tgz#e7b6d0721fb3f4365f69c04d59f74d30354a5b47"
1158+
electron-macos-sign@^1.3.4:
1159+
version "1.3.4"
1160+
resolved "https://registry.yarnpkg.com/electron-macos-sign/-/electron-macos-sign-1.3.4.tgz#641e011f974b26879f05ac505dde94b86481376a"
11611161
dependencies:
11621162
bluebird "^3.4.6"
11631163
compare-version "^0.1.2"

0 commit comments

Comments
 (0)