diff --git a/packages/nx/src/command-line/migrate.ts b/packages/nx/src/command-line/migrate.ts index c1334fcbf57e1..decd9c14b77fa 100644 --- a/packages/nx/src/command-line/migrate.ts +++ b/packages/nx/src/command-line/migrate.ts @@ -56,6 +56,7 @@ import { isCI } from '../utils/is-ci'; import { getNxRequirePaths } from '../utils/installation-directory'; import { readNxJson } from '../config/configuration'; import { runNxSync } from '../utils/child-process'; +import { daemonClient } from '../daemon/client/client'; export interface ResolvedMigrationConfiguration extends MigrationsJson { packageGroup?: ArrayPackageGroup; @@ -1553,6 +1554,8 @@ export async function migrate( process.env.NX_VERBOSE_LOGGING = 'true'; } + await daemonClient.stop(); + return handleErrors(process.env.NX_VERBOSE_LOGGING === 'true', async () => { const opts = await parseMigrationsOptions(args); if (opts.type === 'generateMigrations') { diff --git a/packages/nx/src/daemon/client/client.ts b/packages/nx/src/daemon/client/client.ts index 72b9fac6c59b0..f42fb18badb23 100644 --- a/packages/nx/src/daemon/client/client.ts +++ b/packages/nx/src/daemon/client/client.ts @@ -1,6 +1,7 @@ import { workspaceRoot } from '../../utils/workspace-root'; import { ChildProcess, spawn } from 'child_process'; import { openSync, readFileSync, statSync } from 'fs'; +import { FileHandle, open } from 'fs/promises'; import { ensureDirSync, ensureFileSync } from 'fs-extra'; import { connect } from 'net'; import { join } from 'path'; @@ -48,6 +49,8 @@ export class DaemonClient { private _enabled: boolean | undefined; private _connected: boolean; + private _out: FileHandle = null; + private _err: FileHandle = null; enabled() { if (this._enabled === undefined) { @@ -86,12 +89,19 @@ export class DaemonClient { } reset() { + this.socketMessenger?.close(); this.socketMessenger = null; this.queue = new PromisedBasedQueue(); this.currentMessage = null; this.currentResolve = null; this.currentReject = null; this._enabled = undefined; + + this._out?.close(); + this._err?.close(); + this._out = null; + this._err = null; + this._connected = false; } @@ -312,14 +322,15 @@ export class DaemonClient { ensureDirSync(DAEMON_DIR_FOR_CURRENT_WORKSPACE); ensureFileSync(DAEMON_OUTPUT_LOG_FILE); - const out = openSync(DAEMON_OUTPUT_LOG_FILE, 'a'); - const err = openSync(DAEMON_OUTPUT_LOG_FILE, 'a'); + this._out = await open(DAEMON_OUTPUT_LOG_FILE, 'a'); + this._err = await open(DAEMON_OUTPUT_LOG_FILE, 'a'); + const backgroundProcess = spawn( process.execPath, [join(__dirname, '../server/start.js')], { cwd: workspaceRoot, - stdio: ['ignore', out, err], + stdio: ['ignore', this._out.fd, this._err.fd], detached: true, windowsHide: true, shell: false, diff --git a/packages/nx/src/daemon/tmp-dir.ts b/packages/nx/src/daemon/tmp-dir.ts index d335198422552..459b2fa4ff258 100644 --- a/packages/nx/src/daemon/tmp-dir.ts +++ b/packages/nx/src/daemon/tmp-dir.ts @@ -50,7 +50,7 @@ export function isDaemonDisabled() { function socketDirName() { const hasher = createHash('sha256'); - hasher.update(workspaceRoot); + hasher.update(workspaceRoot.toLowerCase()); const unique = hasher.digest('hex').substring(0, 20); return join(tmpdir, unique); } diff --git a/packages/nx/src/project-graph/project-graph.ts b/packages/nx/src/project-graph/project-graph.ts index 07f07f0a9aacc..b690de2c46532 100644 --- a/packages/nx/src/project-graph/project-graph.ts +++ b/packages/nx/src/project-graph/project-graph.ts @@ -130,10 +130,11 @@ export async function createProjectGraphAsync( } } else { try { + const projectGraph = await daemonClient.getProjectGraph(); if (opts.resetDaemonClient) { daemonClient.reset(); } - return await daemonClient.getProjectGraph(); + return projectGraph; } catch (e) { if (e.message.indexOf('inotify_add_watch') > -1) { // common errors with the daemon due to OS settings (cannot watch all the files available)