1
- import { Target } from "../platformPackager"
1
+ import { Target , toDebArch } from "../platformPackager"
2
2
import { Arch } from "../metadata"
3
3
import { LinuxTargetHelper } from "./LinuxTargetHelper"
4
4
import { LinuxPackager } from "../linuxPackager"
5
5
import { log } from "../util/log"
6
6
import { SnapOptions } from "../options/linuxOptions"
7
- import { emptyDir , writeFile } from "fs-extra-p"
7
+ import { emptyDir , writeFile , rename , copy } from "fs-extra-p"
8
8
import * as path from "path"
9
9
import { safeDump } from "js-yaml"
10
- import { spawn , unlinkIfExists } from "../util/util"
10
+ import { spawn } from "../util/util"
11
11
import { homedir } from "os"
12
12
13
13
export default class SnapTarget extends Target {
14
14
private readonly options : SnapOptions = Object . assign ( { } , this . packager . platformSpecificBuildOptions , ( < any > this . packager . devMetadata . build ) [ this . name ] )
15
- private readonly desktopEntry : Promise < string >
16
15
17
16
constructor ( private packager : LinuxPackager , private helper : LinuxTargetHelper , private outDir : string ) {
18
17
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" )
22
18
}
23
19
24
20
async build ( appOutDir : string , arch : Arch ) : Promise < any > {
@@ -28,8 +24,8 @@ export default class SnapTarget extends Target {
28
24
const appInfo = packager . appInfo
29
25
const options = this . options
30
26
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 )
33
29
34
30
const snap : any = { }
35
31
snap . name = packager . executableName
@@ -39,15 +35,19 @@ export default class SnapTarget extends Target {
39
35
snap . confinement = options . confinement || "strict"
40
36
snap . grade = options . grade || "stable"
41
37
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
+
42
44
if ( options . assumes != null ) {
43
45
if ( ! Array . isArray ( options . assumes ) ) {
44
46
throw new Error ( "snap.assumes must be an array of strings" )
45
47
}
46
48
snap . assumes = options . assumes
47
49
}
48
50
49
- const snapDir = `${ appOutDir } -snap`
50
-
51
51
snap . apps = {
52
52
[ snap . name ] : {
53
53
command : `desktop-launch $SNAP/${ packager . executableName } ` ,
@@ -57,29 +57,26 @@ export default class SnapTarget extends Target {
57
57
}
58
58
}
59
59
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
+
60
64
const isUseDocker = process . platform !== "linux"
61
65
snap . parts = {
62
66
app : {
63
67
plugin : "dump" ,
64
68
"stage-packages" : [ "libappindicator1" , "libdbusmenu-glib4" , "libnotify4" , "libunity9" , "libgconf-2-4" , "libnss3" , "libxss1" , "fontconfig-config" , "libnotify-bin" ] ,
65
69
source : isUseDocker ? `/out/${ path . basename ( snapDir ) } ` : appOutDir ,
66
70
filesets : {
67
- app : [ `${ appOutDir } /*` ]
71
+ app : [ `${ appOutDir } /*` ] ,
68
72
} ,
69
73
after : [ "desktop-glib-only" ]
70
74
}
71
75
}
72
76
73
77
const snapcraft = path . join ( snapDir , "snapcraft.yaml" )
74
- await emptyDir ( snapDir )
75
78
await writeFile ( snapcraft , safeDump ( snap ) )
76
79
77
- // await writeFile(path.join(snapDir, "wrapper"), `
78
- // #!/bin/bash
79
- // unset XDG_CONFIG_DIRS
80
- // exec $SNAP/${packager.executableName}
81
- // `)
82
-
83
80
// const args = ["snapcraft", path.relative(snapDir)]
84
81
// snap /out/${path.basename(snapDir)} --output /out/${path.basename(resultFile)}
85
82
if ( isUseDocker ) {
@@ -100,6 +97,9 @@ export default class SnapTarget extends Target {
100
97
} )
101
98
}
102
99
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 )
104
104
}
105
105
}
0 commit comments