Windows Subsystem for Linux(WSL)使用共享Node.js安装Windows:Node.js npm&;npx二进制文件不工作

Windows Subsystem for Linux(WSL)使用共享Node.js安装Windows:Node.js npm&;npx二进制文件不工作,node.js,ubuntu,npm,windows-10,windows-subsystem-for-linux,Node.js,Ubuntu,Npm,Windows 10,Windows Subsystem For Linux,我最近搬到了Windows+WSL环境(顺便说一句,WSL运行得非常好)。这样做的主要原因是为了有一个Linux环境进行开发,并让Windows用于其他应用程序和游戏,而无需重新启动我的计算机(以前有双启动设置) 在安装过程中,我发现大多数Windows安装的二进制文件都可以从WSL执行。因此,我不必重复安装(例如:在Windows中安装java和maven以使用Eclipse IDE,然后在WSL中单独安装以在终端中使用),而只需在Windows中安装java jdk,并将二进制文件符号链接到

我最近搬到了Windows+WSL环境(顺便说一句,WSL运行得非常好)。这样做的主要原因是为了有一个Linux环境进行开发,并让Windows用于其他应用程序和游戏,而无需重新启动我的计算机(以前有双启动设置)

在安装过程中,我发现大多数Windows安装的二进制文件都可以从WSL执行。因此,我不必重复安装(例如:在Windows中安装java和maven以使用Eclipse IDE,然后在WSL中单独安装以在终端中使用),而只需在Windows中安装java jdk,并将二进制文件符号链接到WSL以共享jdk安装,这样做是完美的)但对节点执行相同操作时,节点npm和npx二进制文件可能无法工作:(

我想安装一个单节点,我可以用它来管理。因此,我以以下方式开始安装:

在WSL中,我配置了我的/etc/WSL.conf(谢谢),以便在/而不是/mnt/安装Windows驱动器:

/etc/wsl.conf

[automount]
root = /
options = "metadata"
然后在windows中安装节点:

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:/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
太好了!(注意:由于节点安装在windows上,当您在WSL上时,您必须在磁盘驱动器中使用它,在本例中为/d)。但是

这就是我写这篇文章的原因。错误很明显,npm试图在一个路径中找到npm-cli.js,该路径是windows路径中npm符号链接位置的有线组合

有没有办法告诉npm/npx它必须从WSL找到文件的正确Windows路径


很抱歉问了这么长的问题,但由于非常特殊的设置,我认为上下文化是必要的。

我有自己的开发环境,因此无法在您的相同环境中测试它。 但是,我建议您检查“程序文件”下的npm是否在WSL上运行良好

user@host:~$ /c/Program\ Files/nodejs/npm -v
在我的例子中,在运行上述命令时会发生另一个错误

Error: EINVAL: invalid argument, uv_pipe_open
如果在您的环境中是相同的,您可以先解决此问题

关于模块路径问题,它似乎是由路径引起的;原始npm(在程序文件下)和您的符号链接具有不同的当前路径

我对原始npm进行了如下修改:

#!/bin/sh
(set -o igncr) 2>/dev/null && set -o igncr; # cygwin encoding fix

basedir=`dirname "$0"`

echo $basedir  # Added code

case `uname` in
    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
...
如果运行原始npm和符号链接,$basedir将显示不同的结果,并导致模块路径问题


如果您可以解决第一个问题(uv_pipe_open error),那么在您的路径上添加nodejs目录而不是符号链接如何?

任何解决方法?我遇到过同样的情况,我希望在WSL和Windows之间共享同一个节点和npm,因为我希望同时在终端(WSL)和IDEA(Windows)中运行它们

我发现npm不能通过drvier运行,比如在
C://
下使用npm,它已安装在
F://
下,导致错误:

internal/modules/cjs/loader.js:638
    throw err;
    ^

Error: Cannot find module 'C:\f\Users\aleen\AppData\Roaming\nvm\v10.21.0\node_modules\npm\bin\npm-cli.js'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
    at Function.Module._load (internal/modules/cjs/loader.js:562:25)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)
但是,我们总是在一个驱动程序中工作,这意味着我们可以在常用的驱动程序下安装npm(
F:///code>),并通过相对路径在驱动程序中创建别名来运行它:

#~/.bash\u别名
函数npm(){
$(realpath--relative=“$(pwd)”/mnt/f/Program\Files/nodejs)/npm$@
}
出口-f npm

我无法在Windows 10中使用Ubuntu 20.04 LTS在WSL中安装npm

但是,当我按照说明操作时,我确实成功地使它工作了。注意,上面说它是针对WSL2的,但是安装节点的步骤在WSL1环境中是有效的(现在是7月20日,我仍然无法在我的Windows 10版本中获得WSL,啊!)

简而言之,此解决方案使您能够在WSL环境中安装nvm(节点版本管理器)

sudo apt-get install curl
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
然后,您可以安装npm默认附带的较新版本的node,例如

nvm install --lts

我建议您检查simple network node.js程序是否运行良好。我怀疑Windows版本node.exe对套接字有不同的实现。我没有遇到无效参数错误,您使用的是什么设置?使用原始位置的二进制文件会以相同的行为结束,但路径不同(WSL中的Windows版本)找不到模块“C:\C\Program Files\nodejs\node\u modules\npm\bin\npm cli.js”这里似乎发生了两件事。npm脚本无法获取符号链接的规范路径,并且具有正确的路径,需要将其转换为Windows路径:/C/foo/bar/baz>C:/foo/bar/baz。我将尝试修改npm脚本pt来实现这一点。也许这可以是对节点源代码的PR?我在WSL和GIt Bash上使用。正如我所知,node.js for Windows与WSL不完全兼容。一些节点模块在GIt Bash和WSL上有不同的实现。因此,我在WSL和GIt Bash上独立设置了node.js。这个问题是为了告诉node:Ben,在你离开之后通过这个过程,npx对你有用吗?我在Ubuntu中使用了类似的方法来安装nvm和node,与在Windows中安装nvm和node不同。问题是来自Ubuntu终端的“哪个npx”仍然以“/mnt/c/Program Files/nodejs/npx”响应。尝试在Ubuntu中运行npx会导致错误,“/mnt/c/Program Files/nodejs/npx:bin/sh^M:bad intrepreter:没有这样的文件或目录”。但是,在Ubuntu中运行“哪个节点”会以“/usr/bin/node”响应,当我执行node命令时,一切似乎都正常。Hi@Lazor。当我遵循这些步骤时,我能够获得nvm(和node)工作,虽然我不认为我试过npx。但是当我在WSL中做这项工作时,我发现WSL是将Windows路径添加到linux路径的罪魁祸首。Luckil
sudo apt-get install curl
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
nvm install --lts