From ba42aa592c6b8c37b6ff80a77f76f08139528769 Mon Sep 17 00:00:00 2001 From: Thuc Pham <51660321+thucpn@users.noreply.github.com> Date: Wed, 24 Jan 2024 17:07:59 +0700 Subject: [PATCH] fix: spawn run fail on window (#419) --- .github/workflows/e2e.yml | 3 ++ packages/create-llama/e2e/basic.spec.ts | 2 +- packages/create-llama/e2e/utils.ts | 15 +++++--- packages/create-llama/helpers/run-app.ts | 47 +++++++++++++++--------- 4 files changed, 42 insertions(+), 25 deletions(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index cc4dbadce..8c294c6da 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -21,6 +21,9 @@ jobs: node-version: [18, 20] python-version: ["3.11"] os: [macos-latest, windows-latest] + defaults: + run: + shell: bash runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 diff --git a/packages/create-llama/e2e/basic.spec.ts b/packages/create-llama/e2e/basic.spec.ts index ee4ba33b6..70ec0b073 100644 --- a/packages/create-llama/e2e/basic.spec.ts +++ b/packages/create-llama/e2e/basic.spec.ts @@ -124,7 +124,7 @@ for (const templateType of templateTypes) { // clean processes test.afterAll(async () => { - appProcess.kill(); + appProcess?.kill(); }); }); } diff --git a/packages/create-llama/e2e/utils.ts b/packages/create-llama/e2e/utils.ts index 9e2c8ddee..e03ec73c7 100644 --- a/packages/create-llama/e2e/utils.ts +++ b/packages/create-llama/e2e/utils.ts @@ -110,15 +110,18 @@ export async function runCreateLlama( console.log(`running command '${command}' in ${cwd}`); let appProcess = exec(command, { cwd, + env: { + ...process.env, + }, }); - appProcess.on("error", (err) => { - console.error(err); - appProcess.kill(); - }); - // Show log from cp - appProcess.stdout?.on("data", (data) => { + appProcess.stderr?.on("data", (data) => { console.log(data.toString()); }); + appProcess.on("exit", (code) => { + if (code !== 0 && code !== null) { + throw new Error(`create-llama command was failed!`); + } + }); // Wait for app to start if (postInstallAction === "runApp") { diff --git a/packages/create-llama/helpers/run-app.ts b/packages/create-llama/helpers/run-app.ts index b77da58bf..dbadda0ba 100644 --- a/packages/create-llama/helpers/run-app.ts +++ b/packages/create-llama/helpers/run-app.ts @@ -1,8 +1,28 @@ -import { ChildProcess, spawn } from "child_process"; -import { log } from "console"; +import { ChildProcess, SpawnOptions, spawn } from "child_process"; import path from "path"; import { TemplateFramework } from "./types"; +const createProcess = ( + command: string, + args: string[], + options: SpawnOptions, +) => { + return spawn(command, args, { + ...options, + shell: true, + }) + .on("exit", function (code) { + if (code !== 0) { + console.log(`Child process exited with code=${code}`); + process.exit(1); + } + }) + .on("error", function (err) { + console.log("Error when running chill process: ", err); + process.exit(1); + }); +}; + // eslint-disable-next-line max-params export async function runApp( appPath: string, @@ -17,13 +37,10 @@ export async function runApp( let backendPort = externalPort || 8000; // Callback to kill app processes - const killAppProcesses = () => { - log("Killing app processes..."); + process.on("exit", () => { + console.log("Killing app processes..."); backendAppProcess.kill(); frontendAppProcess?.kill(); - }; - process.on("exit", () => { - killAppProcesses(); }); let backendCommand = ""; @@ -35,7 +52,7 @@ export async function runApp( "uvicorn", "main:app", "--host=0.0.0.0", - "--port=" + (externalPort || backendPort), + "--port=" + backendPort, ]; } else if (framework === "nextjs") { backendCommand = "npm"; @@ -48,30 +65,24 @@ export async function runApp( if (frontend) { return new Promise((resolve, reject) => { - backendAppProcess = spawn(backendCommand, backendArgs, { + backendAppProcess = createProcess(backendCommand, backendArgs, { stdio: "inherit", cwd: path.join(appPath, "backend"), env: { ...process.env, PORT: `${backendPort}` }, }); - frontendAppProcess = spawn("npm", ["run", "dev"], { + frontendAppProcess = createProcess("npm", ["run", "dev"], { stdio: "inherit", cwd: path.join(appPath, "frontend"), env: { ...process.env, PORT: `${frontendPort}` }, }); - }).catch((err) => { - console.error(err); - killAppProcesses(); }); } else { return new Promise((resolve, reject) => { - backendAppProcess = spawn(backendCommand, backendArgs, { + backendAppProcess = createProcess(backendCommand, backendArgs, { stdio: "inherit", - cwd: appPath, + cwd: path.join(appPath), env: { ...process.env, PORT: `${backendPort}` }, }); - }).catch((err) => { - console.log(err); - killAppProcesses(); }); } } -- GitLab