diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2022-09-27 18:02:35 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-27 18:02:35 -0400 |
commit | a44c83a3d66a576e93f642ec475ea505215a8d62 (patch) | |
tree | 549d3f8d563ef9685f210f37337a9ef3b52f5ec3 /cli/npm/resolvers/local.rs | |
parent | abdb6aad6e3e9aa8b6943eba1bbe297f34a825f4 (diff) |
fix(npm): use ntfs junctions in node_modules folder on Windows (#16061)
Diffstat (limited to 'cli/npm/resolvers/local.rs')
-rw-r--r-- | cli/npm/resolvers/local.rs | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/cli/npm/resolvers/local.rs b/cli/npm/resolvers/local.rs index 35223f1aa..fa2ad4275 100644 --- a/cli/npm/resolvers/local.rs +++ b/cli/npm/resolvers/local.rs @@ -323,9 +323,44 @@ fn symlink_package_dir( // need to delete the previous symlink before creating a new one let _ignore = fs::remove_dir_all(new_path); + + #[cfg(windows)] + return junction_or_symlink_dir(old_path, new_path); + #[cfg(not(windows))] fs_util::symlink_dir(old_path, new_path) } +#[cfg(windows)] +fn junction_or_symlink_dir( + old_path: &Path, + new_path: &Path, +) -> Result<(), AnyError> { + // Use junctions because they're supported on ntfs file systems without + // needing to elevate privileges on Windows + match junction::create(old_path, new_path) { + Ok(()) => Ok(()), + Err(junction_err) => { + if cfg!(debug) { + // When running the tests, junctions should be created, but if not then + // surface this error. + log::warn!("Error creating junction. {:#}", junction_err); + } + + match fs_util::symlink_dir(old_path, new_path) { + Ok(()) => Ok(()), + Err(symlink_err) => bail!( + concat!( + "Failed creating junction and fallback symlink in node_modules folder.\n\n", + "{:#}\n\n{:#}", + ), + junction_err, + symlink_err, + ), + } + } + } +} + fn join_package_name(path: &Path, package_name: &str) -> PathBuf { let mut path = path.to_path_buf(); // ensure backslashes are used on windows |