5

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

在设置过程中,我发现大多数 Windows 安装的二进制文件都可以从 WSL 执行。因此,我可以在 Windows 中安装 java jdk 并将二进制文件符号链接到 WSL共享 jdk 安装,这完美无缺)。但是对节点做同样的事情,节点 npm 和 npx 二进制文件不工作:(

我想拥有一个可以使用nvm windows进行管理的单节点安装。所以我通过以下方式开始安装:

在 WSL 中,我按照此处的 Nick Janetakis 指南(感谢Nick )配置了我的/etc/wsl.conf,以便将 Windows 驱动器安装在/而不是/mnt/

/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:~$ 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

伟大的!(注意:由于节点安装在 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 它必须从 WSL 中找到其文件的正确 Windows 路径?

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

4

5 回答 5

2

我无法在 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 一起提供的较新版本的节点,例如

nvm install --lts
于 2020-07-14T00:19:29.367 回答
1

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

发现npm不能通过drviers运行,比如使用npm under C:/,已经安装在 下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:/对我而言),并创建一个别名以通过相对路径在驱动程序内运行它:

# ~/.bash_aliases
function npm() {
  $(realpath --relative-to="$(pwd)" /mnt/f/Program\ Files/nodejs)/npm $@
}
export -f npm
于 2020-07-02T08:22:48.393 回答
0

巩固和扩展现有答案...

首先,这里的主要答案是:

  • 不要尝试在 WSL/Linux 中使用 Windows 版本的 NodeJS。

    有几个原因:

    1. Windows 的 NodeJS 工具链将期望(a)Windows 路径而不是 Linux 路径(在这个问题中看到的问题)

    2. 即使您解决了这个问题(这就像在风车上倾斜),正如@AnselmoPark 在对此答案的评论中指出的那样:

      一些节点模块在 [Windows] 和 WSL 上有不同的实现

      另请参阅此问题及其答案以获取更多信息。

  • 相反,在 WSL 中安装和使用 NodeJS 工具链的 Linux 版本。

    这最终是BenSmith 的回答所说的,但我会扩展它,说您可以在 Linux 发行版下使用任何受支持的 NodeJS 安装方法。例如,在 Ubuntu 上,您可以从 repo 安装(但请确保您的发行版具有受支持的版本或从 PPA 安装)。

    就个人而言,我使用n,但同样,您可以选择您最喜欢的任何内容。重要的是您在 WSL2 Linux 发行版中安装Linux版本。

次要信息,尚未在任何这些答案中涵盖(但在评论中显示为“仍然不起作用”) - 如果您同时安装了 Windows 版本和 Linux 版本(在 WSL 中) ,您最终可能会遇到@Lazor 在此答案的评论中所做的情况。

问题的发生是因为 Windows Node 为npm运行 Git Bash 的用户提供了一个 shell 脚本。但是,此脚本仍指向 Windows 版本的工具。

如果 Windows NodeJS 在路径中出现Linux 版本之前,那么(当然)它将优先。您需要:

  • 确保 Linux 版本排在第一位
  • 或删除 Windows 版本。

请不要按照建议(如此答案)从 WSL 中完全删除所有 Windows 路径,因为这将严重限制您在 WSL 中运行 Windows 应用程序的能力(其强大功能之一)。

相反,使用 Linux nvm(或n其他工具)通常足以将 Linux NodeJS 目录放在路径的第一个位置。

于 2022-01-20T21:28:51.003 回答
0

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

user@host:~$ /c/Program\ Files/nodejs/npm -v

就我而言,运行上述命令时会发生另一个错误。

Error: EINVAL: invalid argument, uv_pipe_open

如果您的环境相同,您可以先解决此问题。

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

我修改了原来的 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 错误),那么在你的路径上添加 nodejs 目录而不是符号链接怎么样?

于 2019-01-04T09:13:28.970 回答
0

我所做的是修改了位于C:\Program Files\nodejs.

替换这个:

"$NODE_EXE" "$NPM_CLI_JS" "$@"

有了这个:

"$NODE_EXE" "/Program Files/nodejs/node_modules/npm/bin/npm-cli.js" "$@"

然后将其保存为 wsl 中的 unix 格式文件。

于 2021-11-18T10:31:50.067 回答