Skip to content

Commit

Permalink
fix(cli): use shell on win32 for update (jackyzha0#1503) (jackyzha0…
Browse files Browse the repository at this point in the history
…#1504)

If there is no `npm.exe` on the system, but
instead an `npm.cmd`, then node won't find
the `npm` executable when calling `spawnSync`.

This occurs frequently when using node package
managers on Windows.

See the node documentation for `.bat` and `.cmd`
files here.

<https://nodejs.org/api/child_process.html#spawning-bat-and-cmd-files-on-windows>.
  • Loading branch information
ssmendon authored Oct 13, 2024
1 parent 3d0ba32 commit 1dc2083
Showing 1 changed file with 19 additions and 1 deletion.
20 changes: 19 additions & 1 deletion quartz/cli/handlers.js
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,25 @@ export async function handleUpdate(argv) {

await popContentFolder(contentFolder)
console.log("Ensuring dependencies are up to date")
const res = spawnSync("npm", ["i"], { stdio: "inherit" })

/*
On Windows, if the command `npm` is really `npm.cmd', this call fails
as it will be unable to find `npm`. This is often the case on systems
where `npm` is installed via a package manager.
This means `npx quartz update` will not actually update dependencies
on Windows, without a manual `npm i` from the caller.
However, by spawning a shell, we are able to call `npm.cmd`.
See: https://nodejs.org/api/child_process.html#spawning-bat-and-cmd-files-on-windows
*/

const opts = { stdio: "inherit" }
if (process.platform === "win32") {
opts.shell = true
}

const res = spawnSync("npm", ["i"], opts)
if (res.status === 0) {
console.log(chalk.green("Done!"))
} else {
Expand Down

0 comments on commit 1dc2083

Please sign in to comment.