To summarize the issue and solution: When you `npm install` a local path, npm will create a link from the local path to your target `node_modules`. When `npm` creates links, it will always pass `"junction"` as the third argument. This argument is only relevant on Windows and the default value is `"file"`.
Windows distinguishes between different types of link, just like UNIX does, but differently. The most important distinctions are between *file* and *directory* **symlinks** and **junctions** (or reparse points). Instinctively, every developer would want to just use symlinks on Windows as well, but junctions are usually preferable. A symlink on Windows is much more versatile, but we usually don't care about the extra functionality and we also don't want to care about the file/directory distinction. For all intents and purposes, a junction is the way to go. So when you instruct NodeJS to create a symlink on Windows and you don't pass a third argument, NodeJS will create a *file* symlink. [This will usually fail, because the user is not allowed to create symlinks.](https://security.stackexchange.com/questions/10194/why-do-you-have-to-be-an-admin-to-create-a-symlink-in-windows) That is one of the main reasons to always use junctions on Windows. Now when we're instructing `fs-extra` to copy the directory (which is an existing junction), it will detect it as being a symlink (in its own terms; it's still a junction) and instead of copying just create a link between source and destination [**without specifying "junction" as the third argument**](https://github.com/jprichardson/node-fs-extra/blob/402c1d05727f2f9414a4905ffa75f4fa1d99461c/lib/copy-sync/copy-sync.js#L129). This will instruct NodeJS to create a *file* symlink. That either fails instantly or creates the file symlink when the target is actually a directory. So by passing `dereference`, we're letting `fs-extra` know that we care about the referenced directory and not the link itself. It will then properly copy the directory. I'm not sure why `fs-extra` doesn't use `"junction"` or any other kind of detection for this when creating symlinks. [ Full content available at: https://github.com/apache/cordova-lib/pull/705 ] This message was relayed via gitbox.apache.org for [email protected]
