Skip to content

Commit

Permalink
feat(muon): Rebuilding the native dependencies for muon
Browse files Browse the repository at this point in the history
Close #1404
  • Loading branch information
develar committed Apr 8, 2017
1 parent 918a317 commit 3232f65
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 16 deletions.
6 changes: 3 additions & 3 deletions packages/electron-builder/src/cli/install-app-deps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ async function main() {

const projectDir = process.cwd()
const config = (await loadConfig(projectDir)) || {}
const results: Array<string> = await BluebirdPromise.all([
const results = await BluebirdPromise.all<string | null>([
computeDefaultAppDirectory(projectDir, use(config.directories, it => it!.app)),
getElectronVersion(config, projectDir)
config.muonVersion == null ? null : getElectronVersion(config, projectDir),
])

// if two package.json — force full install (user wants to install/update app deps in addition to dev)
await installOrRebuild(config, results[0], results[1], args.platform, args.arch, results[0] !== projectDir)
await installOrRebuild(config, results[0]!, {version: (results[1] || config.muonVersion)!, useCustomDist: config.muonVersion == null}, args.platform, args.arch, results[0] !== projectDir)
}

main()
Expand Down
5 changes: 3 additions & 2 deletions packages/electron-builder/src/cli/node-gyp-rebuild.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
#! /usr/bin/env node

import { exec } from "electron-builder-util"
import { log } from "electron-builder-util/out/log"
import { printErrorAndExit } from "electron-builder-util/out/promise"
import yargs from "yargs"
import { getElectronVersion, loadConfig } from "../util/readPackageJson"
import { log } from "electron-builder-util/out/log"
import { getGypEnv } from "../yarn"

const args: any = yargs
Expand All @@ -21,8 +21,9 @@ async function main() {
const projectDir = process.cwd()
const config = await loadConfig(projectDir)
log(`Execute node-gyp rebuild for ${args.platform}:${args.arch}`)
// this script must be used only for electron
await exec(process.platform === "win32" ? "node-gyp.cmd" : "node-gyp", ["rebuild"], {
env: getGypEnv(await getElectronVersion(config, projectDir), args.platform, args.arch, true),
env: getGypEnv({version: await getElectronVersion(config, projectDir), useCustomDist: true}, args.platform, args.arch, true),
})
}

Expand Down
5 changes: 3 additions & 2 deletions packages/electron-builder/src/packager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -372,11 +372,12 @@ export class Packager implements BuildInfo {
return
}

const frameworkInfo = {version: this.muonVersion || this.electronVersion, useCustomDist: this.muonVersion == null}
const options = this.config
if (options.nodeGypRebuild === true) {
log(`Executing node-gyp rebuild for arch ${Arch[arch]}`)
await exec(process.platform === "win32" ? "node-gyp.cmd" : "node-gyp", ["rebuild"], {
env: getGypEnv(this.electronVersion, platform.nodeName, Arch[arch], true),
env: getGypEnv(frameworkInfo, platform.nodeName, Arch[arch], true),
})
}

Expand All @@ -400,7 +401,7 @@ export class Packager implements BuildInfo {
log("Skip app dependencies rebuild because platform is different")
}
else {
await installOrRebuild(options, this.appDir, this.electronVersion, platform.nodeName, Arch[arch])
await installOrRebuild(options, this.appDir, frameworkInfo, platform.nodeName, Arch[arch])
}
}

Expand Down
32 changes: 23 additions & 9 deletions packages/electron-builder/src/yarn.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,35 @@ import * as path from "path"
import { Config } from "./metadata"
import { readInstalled } from "./readInstalled"

export async function installOrRebuild(config: Config, appDir: string, electronVersion: string, platform: string, arch: string, forceInstall: boolean = false) {
export async function installOrRebuild(config: Config, appDir: string, frameworkInfo: DesktopFrameworkInfo, platform: string, arch: string, forceInstall: boolean = false) {
const args = asArray(config.npmArgs)
if (forceInstall || !(await exists(path.join(appDir, "node_modules")))) {
await installDependencies(appDir, electronVersion, platform, arch, args, !config.npmSkipBuildFromSource)
await installDependencies(appDir, frameworkInfo, platform, arch, args, !config.npmSkipBuildFromSource)
}
else {
await rebuild(appDir, electronVersion, platform, arch, args, !config.npmSkipBuildFromSource)
await rebuild(appDir, frameworkInfo, platform, arch, args, !config.npmSkipBuildFromSource)
}
}

export function getGypEnv(electronVersion: string, platform: string, arch: string, buildFromSource: boolean) {
export interface DesktopFrameworkInfo {
version: string
useCustomDist: boolean
}

export function getGypEnv(frameworkInfo: DesktopFrameworkInfo, platform: string, arch: string, buildFromSource: boolean) {
if (!frameworkInfo.useCustomDist) {
return Object.assign({}, process.env, {
npm_config_arch: arch,
npm_config_target_arch: arch,
npm_config_platform: platform,
npm_config_build_from_source: buildFromSource,
})
}

const gypHome = path.join(homedir(), ".electron-gyp")
return Object.assign({}, process.env, {
npm_config_disturl: "https://atom.io/download/electron",
npm_config_target: electronVersion,
npm_config_target: frameworkInfo.version,
npm_config_runtime: "electron",
npm_config_arch: arch,
npm_config_target_arch: arch,
Expand All @@ -32,7 +46,7 @@ export function getGypEnv(electronVersion: string, platform: string, arch: strin
})
}

function installDependencies(appDir: string, electronVersion: string, platform: string = process.platform, arch: string = process.arch, additionalArgs: Array<string>, buildFromSource: boolean): Promise<any> {
function installDependencies(appDir: string, frameworkInfo: DesktopFrameworkInfo, platform: string = process.platform, arch: string = process.arch, additionalArgs: Array<string>, buildFromSource: boolean): Promise<any> {
log(`Installing app dependencies for arch ${arch} to ${appDir}`)
let execPath = process.env.npm_execpath || process.env.NPM_CLI_JS
const execArgs = ["install", "--production"]
Expand All @@ -56,7 +70,7 @@ function installDependencies(appDir: string, electronVersion: string, platform:
execArgs.push(...additionalArgs)
return spawn(execPath, execArgs, {
cwd: appDir,
env: getGypEnv(electronVersion, platform, arch, buildFromSource),
env: getGypEnv(frameworkInfo, platform, arch, buildFromSource),
})
}

Expand All @@ -73,7 +87,7 @@ function isYarnPath(execPath: string | null) {
return process.env.FORCE_YARN === "true" || (execPath != null && path.basename(execPath).startsWith("yarn"))
}

export async function rebuild(appDir: string, electronVersion: string, platform: string = process.platform, arch: string = process.arch, additionalArgs: Array<string>, buildFromSource: boolean) {
export async function rebuild(appDir: string, frameworkInfo: DesktopFrameworkInfo, platform: string = process.platform, arch: string = process.arch, additionalArgs: Array<string>, buildFromSource: boolean) {
const pathToDep = await readInstalled(appDir)
const nativeDeps = await BluebirdPromise.filter(pathToDep.values(), it => it.extraneous ? false : exists(path.join(it.path, "binding.gyp")), {concurrency: 8})
if (nativeDeps.length === 0) {
Expand All @@ -94,7 +108,7 @@ export async function rebuild(appDir: string, electronVersion: string, platform:
execPath = process.env.npm_node_execpath || process.env.NODE_EXE || "node"
}

const env = getGypEnv(electronVersion, platform, arch, buildFromSource)
const env = getGypEnv(frameworkInfo, platform, arch, buildFromSource)
if (isYarn) {
execArgs.push("run", "install", "--")
execArgs.push(...additionalArgs)
Expand Down

0 comments on commit 3232f65

Please sign in to comment.