From f7b386986ec30f7e4cd3e3f68e078a773940a51c Mon Sep 17 00:00:00 2001 From: frank_wang Date: Fri, 7 Jan 2022 12:59:32 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20use=20junction=20in=20windows=20to=20sol?= =?UTF-8?q?ve=20Error:=20EPERM:=20operation=20not=20per=E2=80=A6=20(#6529)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .changeset/chilled-icons-vanish.md | 5 +++++ packages/builder-util/src/fs.ts | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .changeset/chilled-icons-vanish.md diff --git a/.changeset/chilled-icons-vanish.md b/.changeset/chilled-icons-vanish.md new file mode 100644 index 0000000000..a0886497e3 --- /dev/null +++ b/.changeset/chilled-icons-vanish.md @@ -0,0 +1,5 @@ +--- +"builder-util": patch +--- + +fix: use `junction` for symlink type when on Windows to solve Error: EPERM: operation not permitted diff --git a/packages/builder-util/src/fs.ts b/packages/builder-util/src/fs.ts index dbdcec56d6..a5719fac93 100644 --- a/packages/builder-util/src/fs.ts +++ b/packages/builder-util/src/fs.ts @@ -1,6 +1,7 @@ import BluebirdPromise from "bluebird-lst" import { copyFile as _nodeCopyFile } from "fs-extra" import { Stats } from "fs" +import { platform } from "os" import { access, chmod, mkdir, link, lstat, readdir, readlink, stat, symlink, unlink, writeFile } from "fs/promises" import * as path from "path" import { Mode } from "stat-mode" @@ -283,6 +284,7 @@ export function copyDir(src: string, destination: string, options: CopyDirOption const createdSourceDirs = new Set() const links: Array = [] + const symlinkType = platform() === "win32" ? "junction" : "file" return walk(src, options.filter, { consume: async (file, stat, parent) => { if (!stat.isFile() && !stat.isSymbolicLink()) { @@ -301,7 +303,7 @@ export function copyDir(src: string, destination: string, options: CopyDirOption links.push({ file: destFile, link: await readlink(file) }) } }, - }).then(() => BluebirdPromise.map(links, it => symlink(it.link, it.file), CONCURRENCY)) + }).then(() => BluebirdPromise.map(links, it => symlink(it.link, it.file, symlinkType), CONCURRENCY)) } // eslint-disable-next-line @typescript-eslint/no-unused-vars