I have a problem when installing npm modules. NodeJS is installed on Ubuntu 11.10 running on Virtual Box on Windows host. My project files are on NTFS partition (I have to share them with windows). When I try to install some npm module I get an error, and module is not installed. I've found out that problem occurs when npm tries to create symbolic links.
Probably you can not create symlinks on NTFS partition, when I'm installing module "inside" Linux file system, everything works fine.
How can I fix this? I don't want to resolve dependencies manually :/
For anyone still having this problem after trying
npm install --no-bin-links
.I wasn't able to get any of the above solutions to work when I came across a similar issue running
npm install
on a Laravel Homestead Vagrant box on a Windows 7 host using VirtualBox. The guest box has a mapped directory to the Windows file system.The problem was causing various error messages and failed package installations. The one that is most relevant to the question was
npm ERR! UNKNOWN, symlink '<some filename>'
.To fix this, I was able to successfully run
npm install
on the Git bash command line on Windows rather than bash on the guest Linux.To do this, you will need to install Git for Windows and NodeJS (both on your Windows box).
e.g.
choco install nodejs.install
choco install git.install
C:\Program Files (x86)\Git\Git Bash.vbs
cd /c/projects/projectname
npm install
Everything appears to install successfully.
The Symlink permissions, or the
--no-bin-links
didn't work for us. Instead we opted to move ournode_modules
away from the/vagrant
share. We created a symlink from/vagrant/node_modules
to/tmp/node_modules
. You can only do this if yournode_modules
is not in version control. Check this first!Also see http://kmile.nl/post/73956428426/npm-vagrant-and-symlinks-on-windows
I am pretty certain symlinks can't be created on the shared drive ("shared folder"). Even more impossible with a Windows host machine and a Linux guest.
The host machines are not aware of the filesystem of the guests. A guest machine is a blackbox for the host. You can't say to the host "Well this links to
/etc/...
" when the host doesn't know where this/etc
is :).So in short: unfortunately no.
In some more detail:
I would be really happy if I am wrong! It is a major pain in my development process.
I tried so many options. By default the filesystem that the "shared folders" use is
vboxsf
, something if not the same assamba
(default network sharing protocol for windows) so:There might be a network sharing protocol other than
samba
andnfs
which will perhaps copy the files whenever "symlink" creation is attempted? I don't know really.However I haven't found one yet and also "locking" seems to to be a task of the file-system itself so I doubt any network protocol (unless having a dedicated registry of some sort for locks) can do this.
Since version 1.2.21, npm has a new option for the
install
command.--no-bin-links
You can use if for installing a specific node module
and also for a package.json install
With this option I've been able to install many npm modules without problems in my shared forlder inside the VM (Ubuntu guest, Windows Host)
The commit where the option was added to the npm code is b4c58617039c21c10889a9869f8e86a23e17d3a0
fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
this command enables symlinks on windows. for a better explanation to the cryptic commands at the end visit: How do I overcome the "The symbolic link cannot be followed because its type is disabled." error when getting the target of a symbolic link on Server 2008?
in summary
The behavior codes for fsutil behavior set SymlinkEvaluation - namely L2L, L2R, R2L, and R2R - mean the following:
L stands for "Local", and R for "Remote" (who would've thunk?) The FIRST L or R - before the 2 - refers to the location of the link itself (as opposed to its target) relative to the machine ACCESSING the link. The SECOND L or R - after the 2 - refers to the location of the link's target relative to the machine where the LINK itself is located.
If you don't use native modules (compiled from C/C++) you can just use npm on your Ubuntu VM and copy the node_modules folder to you windows drive.