1
- import * as path from "path"
2
- import { computeDefaultAppDirectory , use , exec , isEmptyOrSpaces } from "electron-builder-util"
3
- import { all , executeFinally } from "electron-builder-util/out/promise"
4
- import { EventEmitter } from "events"
1
+ import { extractFile } from "asar-electron-builder"
5
2
import BluebirdPromise from "bluebird-lst-c"
6
- import { Metadata , Config , AfterPackContext } from "./metadata"
7
- import { PlatformPackager } from "./platformPackager"
8
- import { WinPackager } from "./winPackager"
9
- import * as errorMessages from "./errorMessages"
10
- import * as util from "util"
3
+ import { Arch , Platform , Target } from "electron-builder-core"
4
+ import { computeDefaultAppDirectory , exec , isEmptyOrSpaces , use } from "electron-builder-util"
11
5
import { deepAssign } from "electron-builder-util/out/deepAssign"
6
+ import { log , warn } from "electron-builder-util/out/log"
7
+ import { all , executeFinally } from "electron-builder-util/out/promise"
8
+ import { TmpDir } from "electron-builder-util/out/tmp"
9
+ import { EventEmitter } from "events"
10
+ import * as path from "path"
12
11
import { lt as isVersionLessThan } from "semver"
13
- import { warn , log } from "electron-builder- util/out/log "
12
+ import * as util from "util"
14
13
import { AppInfo } from "./appInfo"
14
+ import * as errorMessages from "./errorMessages"
15
15
import MacPackager from "./macPackager"
16
+ import { AfterPackContext , Config , Metadata } from "./metadata"
17
+ import { ArtifactCreated , BuildInfo , PackagerOptions , SourceRepositoryInfo } from "./packagerApi"
18
+ import { PlatformPackager } from "./platformPackager"
19
+ import { getRepositoryInfo } from "./repositoryInfo"
16
20
import { createTargets } from "./targets/targetFactory"
17
- import { readPackageJson , getElectronVersion , loadConfig } from "./util/readPackageJson"
18
- import { TmpDir } from "electron-builder-util/out/tmp "
21
+ import { getElectronVersion , loadConfig , readPackageJson } from "./util/readPackageJson"
22
+ import { WinPackager } from "./winPackager "
19
23
import { getGypEnv , installOrRebuild } from "./yarn"
20
- import { Platform , Arch , Target } from "electron-builder-core"
21
- import { getRepositoryInfo } from "./repositoryInfo"
22
- import { SourceRepositoryInfo , ArtifactCreated , BuildInfo , PackagerOptions } from "./packagerApi"
23
24
24
25
function addHandler ( emitter : EventEmitter , event : string , handler : Function ) {
25
26
emitter . on ( event , handler )
@@ -31,6 +32,12 @@ export class Packager implements BuildInfo {
31
32
32
33
metadata : Metadata
33
34
35
+ private _isPrepackedAppAsar : boolean
36
+
37
+ get isPrepackedAppAsar ( ) : boolean {
38
+ return this . _isPrepackedAppAsar
39
+ }
40
+
34
41
private devMetadata : Metadata
35
42
36
43
private _config : Config
@@ -93,7 +100,8 @@ export class Packager implements BuildInfo {
93
100
configFromOptions = devMetadataFromOptions . build
94
101
}
95
102
96
- const fileOrPackageConfig = await loadConfig ( this . projectDir )
103
+ const projectDir = this . projectDir
104
+ const fileOrPackageConfig = await loadConfig ( projectDir )
97
105
const config = fileOrPackageConfig == null ? configFromOptions : deepAssign ( fileOrPackageConfig , configFromOptions )
98
106
99
107
const extraMetadata = this . options . extraMetadata
@@ -111,16 +119,15 @@ export class Packager implements BuildInfo {
111
119
}
112
120
113
121
this . _config = config
114
- this . appDir = await computeDefaultAppDirectory ( this . projectDir , use ( config . directories , it => it ! . app ) )
122
+ this . appDir = await computeDefaultAppDirectory ( projectDir , use ( config . directories , it => it ! . app ) )
115
123
116
- this . isTwoPackageJsonProjectLayoutUsed = this . appDir !== this . projectDir
117
- if ( this . isTwoPackageJsonProjectLayoutUsed ) {
118
-
119
- }
124
+ this . isTwoPackageJsonProjectLayoutUsed = this . appDir !== projectDir
120
125
121
- const devPackageFile = path . join ( this . projectDir , "package.json" )
126
+ const devPackageFile = path . join ( projectDir , "package.json" )
122
127
const appPackageFile = this . isTwoPackageJsonProjectLayoutUsed ? path . join ( this . appDir , "package.json" ) : devPackageFile
123
- this . metadata = deepAssign ( await readPackageJson ( appPackageFile ) , this . options . appMetadata , extraMetadata )
128
+
129
+ await this . readProjectMetadata ( appPackageFile , extraMetadata )
130
+
124
131
if ( this . isTwoPackageJsonProjectLayoutUsed ) {
125
132
this . devMetadata = deepAssign ( await readPackageJson ( devPackageFile ) , devMetadataFromOptions )
126
133
}
@@ -137,13 +144,40 @@ export class Packager implements BuildInfo {
137
144
this . checkMetadata ( appPackageFile , devPackageFile )
138
145
checkConflictingOptions ( this . config )
139
146
140
- this . electronVersion = await getElectronVersion ( this . config , this . projectDir )
147
+ this . electronVersion = await getElectronVersion ( this . config , projectDir , this . isPrepackedAppAsar ? this . metadata : null )
141
148
142
149
this . appInfo = new AppInfo ( this . metadata , this )
143
150
const cleanupTasks : Array < ( ) => Promise < any > > = [ ]
144
151
return await executeFinally ( this . doBuild ( cleanupTasks ) , ( ) => all ( cleanupTasks . map ( it => it ( ) ) . concat ( this . tempDirManager . cleanup ( ) ) ) )
145
152
}
146
153
154
+ private async readProjectMetadata ( appPackageFile : string , extraMetadata : any ) {
155
+ try {
156
+ this . metadata = deepAssign ( await readPackageJson ( appPackageFile ) , this . options . appMetadata , extraMetadata )
157
+ }
158
+ catch ( e ) {
159
+ if ( e . code !== "ENOENT" ) {
160
+ throw e
161
+ }
162
+
163
+ try {
164
+ const file = extractFile ( path . join ( this . projectDir , "app.asar" ) , "package.json" )
165
+ if ( file != null ) {
166
+ this . metadata = JSON . parse ( file . toString ( ) )
167
+ this . _isPrepackedAppAsar = true
168
+ return
169
+ }
170
+ }
171
+ catch ( e ) {
172
+ if ( e . code !== "ENOENT" ) {
173
+ throw e
174
+ }
175
+ }
176
+
177
+ throw new Error ( `Cannot find package.json in the ${ path . dirname ( appPackageFile ) } ` )
178
+ }
179
+ }
180
+
147
181
private async doBuild ( cleanupTasks : Array < ( ) => Promise < any > > ) : Promise < Map < Platform , Map < String , Target > > > {
148
182
const distTasks : Array < Promise < any > > = [ ]
149
183
const outDir = path . resolve ( this . projectDir , use ( this . config . directories , it => it ! . output ) || "dist" )
0 commit comments