我最近转到了Windows + WSL环境(顺便说一下,WSL非常好用)。这么做的主要原因是为了有个Linux开发环境,同时在Windows上运行其他应用程序和游戏,而无需重新启动计算机(之前是双启动设置)。
在安装过程中,我发现大多数已安装的Windows二进制文件可以从WSL执行。因此,我可以通过在Windows中安装java和maven来避免重复安装,以便使用Eclipse IDE,并将其链接到WSL,以便在终端中使用它们。
但是使用相同的方式安装node后,发现node npm和npx二进制文件无法工作 :(
我想要一个单独的node安装,我可以使用nvm windows进行管理。因此,我以下面的方式开始安装:
在WSL中,我配置了/etc/wsl.conf,按照Nick Janetakis的指南(感谢Nick),以使Windows驱动器挂载在/而不是/mnt/下:
/etc/wsl.conf
[automount]
root = /
options = "metadata"
然后在Windows中安装了Node:
C:\Windows\system32> nvm install 10.15.0
... installing process...
C:\Windows\system32> nvm use 10.15.0
...success message...
C:\Windows\system32> node -v
v10.15.0
C:\Windows\system32> npm -v
6.4.1
到目前为止,一切都按预期进行。下一步是将Windows节点二进制文件链接到WSL。这些二进制文件位于以下位置:
C:\Windows\system32> where node
C:\Program Files\nodejs\node.exe
C:\Windows\system32> where npm
C:\Program Files\nodejs\npm
C:\Program Files\nodejs\npm.cmd
C:\Windows\system32>where npx
C:\Program Files\nodejs\npx
C:\Program Files\nodejs\npx.cmd
所以在WSL终端中(记住我的磁盘挂载在/c而不是默认的/mnt/c):
user@host:~$ mkdir ~/bin
user@host:~$ ln -s /c/Program\ Files/nodejs/node.exe ~/bin/node
user@host:~$ ln -s /c/Program\ Files/nodejs/npm ~/bin/npm
user@host:~$ ln -s /c/Program\ Files/nodejs/npx ~/bin/npx
并且...
user@host:/d/tmp$ node -v
v10.15.0
user@host:/d/tmp$ echo "console.log('Hello World');" >> index.js
user@host:/d/tmp$ node index.js
Hello World
太好了!(注意:由于Node已安装在Windows上,因此在WSL上使用时必须将其用于磁盘驱动器中,本例中为/d)。但是...
user@host:~$ npm -v
internal/modules/cjs/loader.js:583
throw err;
^
Error: Cannot find module 'C:\home\user\bin\node_modules\npm\bin\npm-cli.js'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
at Function.Module._load (internal/modules/cjs/loader.js:507:25)
at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
at startup (internal/bootstrap/node.js:283:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
这就是我写下这封邮件的原因。错误很明显,npm试图在一个混乱的路径中找到npm-cli.js,其中包含了Windows路径中npm符号链接的位置。
有没有办法告诉npm/npx正确的Windows路径,让它从WSL中找到文件?
很抱歉问题比较长,但由于设置非常特殊,所以我认为这种情况的背景必要。