Skip to content

Commit 3aaf025

Browse files
committed
feat: exclude extraResources/extraFiles for one-package dir
Close #599
1 parent 5895583 commit 3aaf025

File tree

3 files changed

+112
-5
lines changed

3 files changed

+112
-5
lines changed

src/platformPackager.ts

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,17 @@ export abstract class PlatformPackager<DC extends PlatformSpecificBuildOptions>
154154

155155
abstract pack(outDir: string, arch: Arch, targets: Array<Target>, postAsyncTasks: Array<Promise<any>>): Promise<any>
156156

157+
private getExtraFilePatterns(isResources: boolean, arch: Arch, customBuildOptions: DC): Array<Minimatch> | null {
158+
const patterns = this.getFilePatterns(isResources ? "extraResources" : "extraFiles", customBuildOptions)
159+
return patterns == null || patterns.length === 0 ? null : this.getParsedPatterns(patterns, arch)
160+
}
161+
157162
protected async doPack(options: ElectronPackagerOptions, outDir: string, appOutDir: string, platformName: string, arch: Arch, platformSpecificBuildOptions: DC) {
158163
const asarOptions = this.computeAsarOptions(platformSpecificBuildOptions)
164+
165+
const extraResourcePatterns = this.getExtraFilePatterns(true, arch, platformSpecificBuildOptions)
166+
const extraFilePatterns = this.getExtraFilePatterns(false, arch, platformSpecificBuildOptions)
167+
159168
const p = pack(options, appOutDir, platformName, Arch[arch], this.info.electronVersion, async() => {
160169
const ignoreFiles = new Set([path.relative(this.info.appDir, outDir), path.relative(this.info.appDir, this.buildResourcesDir)])
161170
if (!this.info.isTwoPackageJsonProjectLayoutUsed) {
@@ -196,8 +205,24 @@ export abstract class PlatformPackager<DC extends PlatformSpecificBuildOptions>
196205
rawFilter = deprecatedUserIgnoreFilter(options, this.info.appDir)
197206
}
198207

208+
const filePatterns = this.getParsedPatterns(patterns, arch)
209+
let excludePatterns: Array<Minimatch> | null = null
210+
if (!this.info.isTwoPackageJsonProjectLayoutUsed) {
211+
if (extraResourcePatterns != null) {
212+
excludePatterns = extraResourcePatterns
213+
}
214+
if (extraFilePatterns != null) {
215+
if (excludePatterns == null) {
216+
excludePatterns = extraFilePatterns
217+
}
218+
else {
219+
excludePatterns = excludePatterns.concat(extraFilePatterns)
220+
}
221+
}
222+
}
223+
199224
const resourcesPath = this.platform === Platform.MAC ? path.join(appOutDir, "Electron.app", "Contents", "Resources") : path.join(appOutDir, "resources")
200-
const filter = createFilter(this.info.appDir, this.getParsedPatterns(patterns, arch), ignoreFiles, rawFilter)
225+
const filter = createFilter(this.info.appDir, filePatterns, ignoreFiles, rawFilter, excludePatterns)
201226
const promise = asarOptions == null ?
202227
copyFiltered(this.info.appDir, path.join(resourcesPath, "app"), filter, this.platform === Platform.WINDOWS)
203228
: createAsarArchive(this.info.appDir, resourcesPath, asarOptions, filter)
@@ -289,8 +314,8 @@ export abstract class PlatformPackager<DC extends PlatformSpecificBuildOptions>
289314

290315
private async doCopyExtraFiles(isResources: boolean, appOutDir: string, arch: Arch, customBuildOptions: DC): Promise<any> {
291316
const base = isResources ? this.getResourcesDir(appOutDir) : this.platform === Platform.MAC ? path.join(appOutDir, `${this.appInfo.productFilename}.app`, "Contents") : appOutDir
292-
const patterns = this.getFilePatterns(isResources ? "extraResources" : "extraFiles", customBuildOptions)
293-
return patterns == null || patterns.length === 0 ? null : copyFiltered(this.projectDir, base, createFilter(this.projectDir, this.getParsedPatterns(patterns, arch)), this.platform === Platform.WINDOWS)
317+
const patterns = this.getExtraFilePatterns(isResources, arch, customBuildOptions)
318+
return patterns == null || patterns.length === 0 ? null : copyFiltered(this.projectDir, base, createFilter(this.projectDir, patterns), this.platform === Platform.WINDOWS)
294319
}
295320

296321
private getParsedPatterns(patterns: Array<string>, arch: Arch): Array<Minimatch> {

src/util/filter.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export function hasMagic(pattern: Minimatch) {
2929
return false
3030
}
3131

32-
export function createFilter(src: string, patterns: Array<Minimatch>, ignoreFiles?: Set<string>, rawFilter?: (file: string) => boolean): (file: string) => boolean {
32+
export function createFilter(src: string, patterns: Array<Minimatch>, ignoreFiles?: Set<string>, rawFilter?: (file: string) => boolean, excludePatterns?: Array<Minimatch> | null): (file: string) => boolean {
3333
return function filter(it) {
3434
if (src === it) {
3535
return true
@@ -49,7 +49,8 @@ export function createFilter(src: string, patterns: Array<Minimatch>, ignoreFile
4949
if (path.sep === "\\") {
5050
relative = relative.replace(/\\/g, "/")
5151
}
52-
return minimatchAll(relative, patterns)
52+
53+
return minimatchAll(relative, patterns) && (excludePatterns == null || !minimatchAll(relative, excludePatterns))
5354
}
5455
}
5556

test/src/globTest.ts

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,3 +202,84 @@ test("extraResources", async () => {
202202
})
203203
}
204204
})
205+
206+
test("extraResources - one-package", async () => {
207+
for (let platform of [Platform.LINUX]) {
208+
const osName = platform.buildConfigurationKey
209+
210+
const winDirPrefix = "lib/net45/resources/"
211+
212+
//noinspection SpellCheckingInspection
213+
await assertPack("test-app-one", {
214+
// to check NuGet package
215+
targets: platform.createTarget(platform === Platform.WINDOWS ? null : DIR_TARGET),
216+
devMetadata: {
217+
build: {
218+
asar: true,
219+
},
220+
},
221+
}, {
222+
tempDirCreated: projectDir => {
223+
return BluebirdPromise.all([
224+
modifyPackageJson(projectDir, data => {
225+
data.build.extraResources = [
226+
"foo",
227+
"bar/hello.txt",
228+
"bar/${arch}.txt",
229+
"${os}/${arch}.txt",
230+
]
231+
232+
data.build[osName] = {
233+
extraResources: [
234+
"platformSpecificR"
235+
],
236+
extraFiles: [
237+
"platformSpecificF"
238+
],
239+
}
240+
}),
241+
outputFile(path.join(projectDir, "foo/nameWithoutDot"), "nameWithoutDot"),
242+
outputFile(path.join(projectDir, "bar/hello.txt"), "data"),
243+
outputFile(path.join(projectDir, "foo", ".dot"), "data"),
244+
outputFile(path.join(projectDir, `bar/${process.arch}.txt`), "data"),
245+
outputFile(path.join(projectDir, `${osName}/${process.arch}.txt`), "data"),
246+
outputFile(path.join(projectDir, "platformSpecificR"), "platformSpecificR"),
247+
outputFile(path.join(projectDir, "ignoreMe.txt"), "ignoreMe"),
248+
])
249+
},
250+
packed: async (projectDir) => {
251+
const base = path.join(projectDir, outDirName, platform.buildConfigurationKey)
252+
let resourcesDir = path.join(base, "resources")
253+
if (platform === Platform.MAC) {
254+
resourcesDir = path.join(base, "TestApp.app", "Contents", "Resources")
255+
}
256+
else if (platform === Platform.WINDOWS) {
257+
resourcesDir = path.join(base + "-unpacked", "resources")
258+
}
259+
const appDir = path.join(resourcesDir, "app")
260+
261+
await assertThat(path.join(resourcesDir, "foo")).isDirectory()
262+
await assertThat(path.join(appDir, "foo")).doesNotExist()
263+
264+
await assertThat(path.join(resourcesDir, "foo", "nameWithoutDot")).isFile()
265+
await assertThat(path.join(appDir, "foo", "nameWithoutDot")).doesNotExist()
266+
267+
await assertThat(path.join(resourcesDir, "bar", "hello.txt")).isFile()
268+
await assertThat(path.join(resourcesDir, "bar", `${process.arch}.txt`)).isFile()
269+
await assertThat(path.join(appDir, "bar", `${process.arch}.txt`)).doesNotExist()
270+
271+
await assertThat(path.join(resourcesDir, osName, `${process.arch}.txt`)).isFile()
272+
await assertThat(path.join(resourcesDir, "platformSpecificR")).isFile()
273+
await assertThat(path.join(resourcesDir, "ignoreMe.txt")).doesNotExist()
274+
await assertThat(path.join(resourcesDir, "foo", ".dot")).doesNotExist()
275+
},
276+
expectedContents: platform === Platform.WINDOWS ? pathSorter(expectedWinContents.concat(
277+
winDirPrefix + "bar/hello.txt",
278+
winDirPrefix + "bar/x64.txt",
279+
winDirPrefix + "foo/nameWithoutDot",
280+
winDirPrefix + "platformSpecificR",
281+
winDirPrefix + "win/x64.txt"
282+
)) : null,
283+
})
284+
}
285+
})

0 commit comments

Comments
 (0)