diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3145a4c..2f8f22c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: macos-14, # ARM ubuntu-latest, # x64 buildjet-2vcpu-ubuntu-2204-arm, # ARM - # windows-latest, # deactivated for now as there is still a Windows issue + windows-latest, ] runs-on: ${{matrix.os}} diff --git a/src/NewProject.res b/src/NewProject.res index 9554980..f76211b 100644 --- a/src/NewProject.res +++ b/src/NewProject.res @@ -69,7 +69,7 @@ let createProject = async (~templateName, ~projectName, ~versions) => { await updateRescriptJson(~projectName, ~versions) await RescriptVersions.installVersions(versions) - let _ = await Promisified.ChildProcess.execFile("git", ["init"]) + let _ = await Promisified.ChildProcess.exec("git init") if !CI.isRunningInCI { s->P.Spinner.stop("Project created.") diff --git a/src/RescriptVersions.res b/src/RescriptVersions.res index 4f1ff70..225c1b2 100644 --- a/src/RescriptVersions.res +++ b/src/RescriptVersions.res @@ -67,7 +67,15 @@ let installVersions = async ({rescriptVersion, rescriptCoreVersion}) => { let packageManager = PackageManagers.getActivePackageManager() let packages = [`rescript@${rescriptVersion}`, `@rescript/core@${rescriptCoreVersion}`] - let _ = await Node.Promisified.ChildProcess.execFile(packageManager, ["add", ...packages]) + // #58: Windows: packageManager may be something like + // "C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js". + // + // Therefore, packageManager needs to be in quotes, and we need to prepend "node " + // if packageManager points to a JS file, otherwise the invocation will hang. + let maybeNode = packageManager->String.endsWith("js") ? "node " : "" + let command = `${maybeNode}"${packageManager}" add ${packages->Array.join(" ")}` + + let _ = await Node.Promisified.ChildProcess.exec(command) } let esmModuleSystemName = ({rescriptVersion}) => diff --git a/src/bindings/Node.res b/src/bindings/Node.res index 795fe40..14d14e9 100644 --- a/src/bindings/Node.res +++ b/src/bindings/Node.res @@ -85,6 +85,6 @@ module Promisified = { type execResult = {stdout: string, stderr: string} @module("./NodePromisified.mjs") - external execFile: (string, array) => promise = "execFile" + external exec: string => promise = "exec" } } diff --git a/src/bindings/NodePromisified.mjs b/src/bindings/NodePromisified.mjs index b8d35bf..afe0874 100644 --- a/src/bindings/NodePromisified.mjs +++ b/src/bindings/NodePromisified.mjs @@ -1,4 +1,4 @@ -import { execFile as execFileCallback } from "child_process"; +import { exec as execCallback } from "child_process"; import { promisify } from "util"; -export const execFile = promisify(execFileCallback); +export const exec = promisify(execCallback);