@@ -32,26 +32,28 @@ const defaultPlugs = ["desktop", "desktop-legacy", "home", "x11", "unity7", "bro
32
32
export default class SnapTarget extends Target {
33
33
readonly options : SnapOptions = { ...this . packager . platformSpecificBuildOptions , ...( this . packager . config as any ) [ this . name ] }
34
34
35
+ private isUsePrepackedSnap = true
36
+
35
37
constructor ( name : string , private readonly packager : LinuxPackager , private readonly helper : LinuxTargetHelper , readonly outDir : string ) {
36
38
super ( name )
37
39
}
38
40
41
+ private replaceDefault ( inList : Array < string > | null | undefined , defaultList : Array < string > ) {
42
+ const result = _replaceDefault ( inList , defaultList )
43
+ if ( result !== defaultList ) {
44
+ this . isUsePrepackedSnap = false
45
+ }
46
+ return result
47
+ }
48
+
39
49
async build ( appOutDir : string , arch : Arch ) : Promise < any > {
40
50
const packager = this . packager
41
51
const appInfo = packager . appInfo
42
52
const options = this . options
43
53
const snapName = packager . executableName . toLowerCase ( )
44
54
const buildPackages = asArray ( options . buildPackages )
45
55
const isUseDocker = process . platform !== "linux" || isEnvTrue ( process . env . SNAP_USE_DOCKER )
46
- let isUsePrepackedSnap = arch === Arch . x64 && buildPackages . length === 0
47
-
48
- function replaceDefault ( inList : Array < string > | null | undefined , defaultList : Array < string > ) {
49
- const result = _replaceDefault ( inList , defaultList )
50
- if ( result !== defaultList ) {
51
- isUsePrepackedSnap = false
52
- }
53
- return result
54
- }
56
+ this . isUsePrepackedSnap = arch === Arch . x64 && buildPackages . length === 0
55
57
56
58
const snap : any = {
57
59
name : snapName ,
@@ -67,38 +69,55 @@ export default class SnapTarget extends Target {
67
69
TMPDIR : "$XDG_RUNTIME_DIR" ,
68
70
...options . environment ,
69
71
} ,
70
- plugs : replaceDefault ( options . plugs , defaultPlugs ) ,
72
+ plugs : this . replaceDefault ( options . plugs , defaultPlugs ) ,
71
73
}
72
74
} ,
73
75
parts : {
74
76
app : {
75
77
plugin : "dump" ,
76
- "stage-packages" : replaceDefault ( options . stagePackages , defaultStagePackages ) ,
78
+ "stage-packages" : this . replaceDefault ( options . stagePackages , defaultStagePackages ) ,
77
79
source : isUseDocker ? "/appOutDir" : appOutDir ,
78
- after : replaceDefault ( options . after , [ "desktop-gtk2" ] ) ,
80
+ after : this . replaceDefault ( options . after , [ "desktop-gtk2" ] ) ,
79
81
}
80
82
} ,
81
83
}
82
84
83
- if ( options . assumes != null ) {
84
- snap . assumes = asArray ( options . assumes )
85
+ const wrapperFileName = `command-${ packager . executableName } .wrapper`
86
+ if ( this . isUsePrepackedSnap ) {
87
+ delete snap . parts
88
+ snap . apps [ snapName ] . command = wrapperFileName
85
89
}
86
90
87
91
const snapFileName = `${ snap . name } _${ snap . version } _${ toLinuxArchString ( arch ) } .snap`
88
92
const artifactPath = path . join ( this . outDir , snapFileName )
89
93
this . logBuilding ( "snap" , artifactPath , arch )
90
94
95
+ if ( options . assumes != null ) {
96
+ snap . assumes = asArray ( options . assumes )
97
+ }
98
+
91
99
const stageDir = await createStageDir ( this , packager , arch )
92
100
// snapcraft.yaml inside a snap directory
93
101
const snapDir = path . join ( stageDir . dir , "snap" )
102
+ const snapMetaDir = this . isUsePrepackedSnap ? path . join ( stageDir . dir , "meta" ) : snapDir
94
103
95
104
await this . helper . icons
96
105
if ( this . helper . maxIconPath != null ) {
97
- snap . icon = "snap/gui/icon.png"
98
- await copyFile ( this . helper . maxIconPath , path . join ( snapDir , "gui" , "icon.png" ) )
106
+ if ( ! this . isUsePrepackedSnap ) {
107
+ snap . icon = "snap/gui/icon.png"
108
+ }
109
+ await copyFile ( this . helper . maxIconPath , path . join ( snapMetaDir , "gui" , "icon.png" ) )
99
110
}
100
111
101
- const desktopFile = await this . helper . writeDesktopEntry ( this . options , packager . executableName , path . join ( snapDir , "gui" , `${ snap . name } .desktop` ) , {
112
+ const hooksDir = await packager . getResource ( options . hooks , "snap-hooks" )
113
+ if ( hooksDir != null ) {
114
+ await copyDir ( hooksDir , path . join ( snapMetaDir , "hooks" ) , {
115
+ isUseHardLink : USE_HARD_LINKS ,
116
+ } )
117
+ }
118
+
119
+ const desktopFile = path . join ( snapMetaDir , "gui" , `${ snap . name } .desktop` )
120
+ await this . helper . writeDesktopEntry ( this . options , packager . executableName , desktopFile , {
102
121
// tslint:disable:no-invalid-template-strings
103
122
Icon : "${SNAP}/meta/gui/icon.png"
104
123
} )
@@ -107,43 +126,42 @@ export default class SnapTarget extends Target {
107
126
return
108
127
}
109
128
110
- const snapcraftFile = isUsePrepackedSnap ? path . join ( stageDir . dir , "meta" , "snap.yaml" ) : path . join ( snapDir , "snapcraft.yaml" )
129
+ const snapcraftFile = path . join ( snapMetaDir , this . isUsePrepackedSnap ? "snap.yaml" : "snapcraft.yaml" )
111
130
await outputFile ( snapcraftFile , serializeToYaml ( snap ) )
112
- const snapTemplateDir = isUsePrepackedSnap ? await getSnapTemplate ( ) : null
113
- if ( isUsePrepackedSnap ) {
131
+ if ( this . isUsePrepackedSnap ) {
114
132
// noinspection SpellCheckingInspection
115
- await writeFile ( path . join ( stageDir . dir , `command- ${ packager . executableName } ` ) , `#!/bin/sh
133
+ await writeFile ( path . join ( stageDir . dir , wrapperFileName ) , `#!/bin/sh
116
134
export PATH="$SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH"
117
135
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu"
118
136
export LD_LIBRARY_PATH="$SNAP/usr/lib/x86_64-linux-gnu/mesa-egl:$LD_LIBRARY_PATH"
119
137
export LD_LIBRARY_PATH="$SNAP/usr/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu/pulseaudio:$LD_LIBRARY_PATH"
120
138
export LD_LIBRARY_PATH=$SNAP_LIBRARY_PATH:$LD_LIBRARY_PATH
121
139
exec "desktop-launch" "$SNAP/${ packager . executableName } " "$@"
122
140
` , { mode : "0755" } )
123
- await copyDir ( path . join ( snapDir , "gui" ) , path . join ( stageDir . dir , "meta" , "gui" ) )
124
- await copyDir ( snapTemplateDir ! ! , stageDir . dir , {
141
+
142
+ await copyDir ( await getSnapTemplate ( ) , stageDir . dir , {
125
143
isUseHardLink : USE_HARD_LINKS ,
126
144
} )
127
145
await copyDirUsingHardLinks ( appOutDir , stageDir . dir )
128
146
}
129
147
130
148
if ( isUseDocker ) {
131
- if ( isUsePrepackedSnap ) {
149
+ if ( this . isUsePrepackedSnap ) {
132
150
await this . buildUsingDockerAndPrepackedSnap ( snapFileName , stageDir )
133
151
}
134
152
else {
135
153
await this . buildUsingDocker ( options , arch , snapFileName , stageDir , appOutDir )
136
154
}
137
155
}
138
156
else {
139
- await this . buildWithoutDocker ( buildPackages , stageDir . dir , isUsePrepackedSnap , arch , artifactPath )
157
+ await this . buildWithoutDocker ( buildPackages , stageDir . dir , arch , artifactPath )
140
158
}
141
159
142
160
await stageDir . cleanup ( )
143
161
packager . dispatchArtifactCreated ( artifactPath , this , arch )
144
162
}
145
163
146
- private async buildWithoutDocker ( buildPackages : Array < string > , stageDir : string , isUsePrepackedSnap : boolean , arch : Arch , artifactPath : string ) {
164
+ private async buildWithoutDocker ( buildPackages : Array < string > , stageDir : string , arch : Arch , artifactPath : string ) {
147
165
if ( buildPackages . length > 0 ) {
148
166
const notInstalledPackages = await BluebirdPromise . filter ( buildPackages , ( it ) : Promise < boolean > => {
149
167
return exec ( "dpkg" , [ "-s" , it ] )
@@ -160,7 +178,7 @@ exec "desktop-launch" "$SNAP/${packager.executableName}" "$@"
160
178
}
161
179
162
180
let primeDir : string
163
- if ( isUsePrepackedSnap ) {
181
+ if ( this . isUsePrepackedSnap ) {
164
182
primeDir = stageDir
165
183
}
166
184
else {
0 commit comments