首页 > 解决方案 > 如何使 nodemon 与 WSL 2 一起使用?

问题描述

nodemon自从使用 Windows 10 April 2020 更新从 WSL 1 更新到 WSL 2 之后(之后将 Ubuntu 18 更新到 Ubuntu 20),当项目目录中有文件更改时,我一直无法进行热重载。当我对文件进行任何更改时.js,不会重新启动服务器或在终端输出:

在此处输入图像描述

nodemon我用这样的方式启动我的 Node.js 服务器:

NODE_ENV=development DEBUG='knex:*' nodemon --verbose --inspect ./server.js"

如果它有用,这是我的server.js

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server started and listening on port ${PORT}`);
});

我什至不确定如何进一步解决此问题以获得有关正在发生的事情的更多有用信息。

标签: node.jswindows-subsystem-for-linuxnodemonubuntu-20.04wsl-2

解决方案


根本原因:

WSL2 上的 9P 文件系统协议不完全支持 inotify。

WSL 项目上有几个与此相关的 github 问题,但可能最相关的是#4739

可能的解决方法:

  1. 按照 Simperfy 的建议 尝试nodemon -L(又名)。--legacy-watch

  2. 尝试从默认的 ext4 文件系统(例如mkdir -p $HOME/Projects/testserver)运行。请注意,指向 Windows 文件系统的符号链接仍然不起作用。作为奖励,对于像 git 这样的文件密集型操作,WSL ext4 文件系统将更快。

    您仍然可以通过 Windows 编辑器和工具访问源代码\\wsl$\

  3. 使用带有Remote-WSL 扩展的 Visual Studio Code在 Windows 文件系统上编辑您的源代码。最简单的方法是在 WSL 中导航到您的项目目录并运行code ..

    由于某种原因,Visual Studio Code 的 WSL 集成确实会触发 inotify。

  4. 如果您不需要任何 WSL2 功能,请将会话降级到 WSL1。我保留了 WSL1 和 WSL2 会话。最好的方法是使用 和 创建会话wsl --export备份wsl --import。您可以随时使用 切换 WSL 发行版的版本wsl --set-version

    我确实在 WSL1 上使用 Windows 文件系统下的示例项目对此进行了测试,并且在 Windows 下通过诸如 notepad.exe 之类的基本内容进行编辑仍然会触发 nodemon 重新启动。

更长的答案:

/nodemon 在根 ( ) ext4 挂载 (例如)上的 WSL2 上为我“开箱即用”工作$HOME/src/testserver

/mnt/c当我在WSL/WSL2 创建的默认挂载下尝试它时,它也能正常工作。当然,在 WSL2 下要慢 /mnt/c得多编辑- 事实证明,当我尝试这样做时,我正在使用 Visual Studio Code。从 Windows 文件系统上的其他 Windows 应用程序进行编辑不会触发 nodemon 重新启动。

但是查看屏幕截图的第一行,我看到您正在从/c/Users/...运行它。我想也许您创建了这个(也许是 CIFS)挂载来尝试解决 WSL2 性能问题 - 这是一种常见的解决方法。

我没有设置 CIFS 挂载,但我能够通过挂载(替换您的 Windows 用户名)重现您的问题:

mkdir $HOME/mnttest
sudo mount -t drvfs 'C:' $HOME/mnttest
cd $HOME/mnttest/Users/Raj/Projects/testserver

从该挂载运行nodemon以您描述的相同方式失败-对源的更改未触发重新启动。

但是,nodemon -L在此挂载上运行 with确实会在更改源文件时触发重新启动。

也可以通过安装不同的选项来解决问题,但我现在不确定。 编辑- 鉴于 Github 上的错误报告,似乎不太可能。

此外,您可能希望创建一些 WSL 会话的导出/备份。此时为时已晚(对于您之前的安装),但您可以wsl.exe --export在升级之前运行以创建 Ubuntu 18.04/WSL1 文件系统的备份。您还可以使用 更改特定发行版的版本wsl.exe --set-version。这可以为您提供更好的“之前/之后”测试比较。


推荐阅读