无法在 WSL 中从 npm/yarn link 加载 linked 模块
Cannot load linked modules from npm/yarn link in WSL
我 运行 在尝试将本地依赖项导入我的项目时遇到了一个非常奇怪的问题。
我有一个名为 'test_project' 的项目和另一个将 linked 的项目,名为 'test_module'。我 link 测试模块到全局 node_modules 文件夹(我试过 npm link 和 yarn link)。然后在test_project我linktest_module。我将 test_module 导入到 index.js 文件中,但是当我执行 yarn/npm 启动时出现此错误:
Failed to compile.
./src/index.js
Cannot find file: 'index.js' does not match the corresponding name on disk: '/mnt/c/users/<my_username>/Projects/test_module/Users'.
无论出于何种原因,“/Users”都被添加到路径的末尾,我不知道为什么。我现在已经吹走了我的环境两次,而且它一直在发生。这是WSL的问题吗?是我配置有误吗?
编辑:'test_project' 是从 create-react-app 生成的,没有任何修改。如果您想知道我的环境是如何设置的。
EDIT2:我在 Window 的 CMD 中试过了,一切正常。所以看起来问题是由 WSL、我的节点安装以及其他任何问题的组合引起的:/
谢谢
我想出了解决问题的方法。您需要编辑 wsl 配置并将根设置为“/”。我的理论是某处正在使用相对路径,并且使用“/”作为根从路径中删除“/mnt/”,允许它正确地后退。但是,我无法用事实来支持它:D
无论如何,修复很容易。
sudo vim /etc/wsl.conf
然后添加此字段,使文件如下所示:
[automount]
root = /
options = "metadata"
(我有解决权限问题的选项字段)
然后完全logout/signout,重新登录,unlink模块,吹走node_modules文件夹,运行 npm install,然后重新link。届时应该一切正常。
干杯!
这个问题让我抓狂了很长时间,但我能够为我正在处理的项目解决它。 (不幸的是,重新安装 WSL root 并没有为我解决问题。)症状与原始问题中的症状 略有 不同,但我希望我发现的至少可以提供一些见解。
对我来说,这个问题是多种因素的结合。每当我尝试为某个项目 运行 react-scripts start
时,它就会发生。奇怪的是我在 WSL 中有另一个项目,其设置几乎相同 运行 没问题。
经过一些黑客攻击,我将问题缩小到 case-sensitive-paths-webpack-plugin that react-scripts
was using internally. By dropping a bunch of console.log()
statements in the fileExistsWithCase 方法,我能够查明问题的原因。
该方法确认磁盘上是否存在大小写与传递的字符串 (filepath
) 匹配的 file/directory。为此,它递归地检查路径中的每个目录。不幸的是,错误记录似乎有点损坏,因为当错误通过递归循环冒泡时,它会附加错误文件夹的名称,就好像它是原始文件名一样(报告为 an issue in the create-react-app repo)。
例如,原题的错误是
Cannot find file: 'index.js' does not match the corresponding name on disk: '/mnt/c/users/<my_username>/Projects/test_module/Users'.
在这种情况下,在递归几次后,库列出了 /mnt/c
中的所有内容,并且看到 users
目录不存在但 Users
目录存在,错误冒出并被错误地报告为 /mnt/c/users/<my_username>/Projects/test_module/Users
.
的错误文件
现在,在检查每个 file/directory 时,库首先检查其缓存。并且提前 primes the cache with the current working directory。这最终就是为什么我的一个项目成功而另一个却失败的原因。工作的项目使用 npm,所以 node_modules 的形式是 $PWD/node_modules/foo
,一旦达到 $PWD
就会停止递归。然而,另一个项目使用的是 pnpm,失败的依赖项被提升到更高的目录。在我的例子中,每当它试图验证我系统上名为 /mnt/c/Users/[username]/wslhome
的目录时,这些依赖项就会失败,它在磁盘上看到的是 WSLHome
。
我很幸运能够将 WSLHome
重命名为 wslhome
让我的项目工作起来。不幸的是 /mnt/c/Users
不会那么容易重命名,因为它是由 Windows 创建的。
总的来说,问题似乎主要取决于包依赖项的绝对路径是如何定义的,以及外壳是否与 Node path
所看到的相匹配。
更新:当我今天去使用这个项目时,它又开始失败了,这次是抱怨 "Users" 目录的大小写不正确。 -_- 所以看起来问题可能有些不一致。我看到一篇关于 updating case sensitivity options when using Windows directories 的文章,将 case=dir
添加到我的 wsl.conf 选项并重新启动子系统后,错误消失了。然而,鉴于其不一致的性质,我不能确定这是否是解决方案。
另一个可能相关的观察结果是,当 运行ning readlink -f
依赖于一个依赖目录时,差异似乎是可见的。有时结果有合适的大小写,有时则没有。 (例如,现在,readlink -f ~/dev
不正确 returns /mnt/c/users
的子目录,而 readlink -f .
正确地 returns /mnt/c/Users
的子目录,而在 ~/dev
目录。)
我 运行 在尝试将本地依赖项导入我的项目时遇到了一个非常奇怪的问题。
我有一个名为 'test_project' 的项目和另一个将 linked 的项目,名为 'test_module'。我 link 测试模块到全局 node_modules 文件夹(我试过 npm link 和 yarn link)。然后在test_project我linktest_module。我将 test_module 导入到 index.js 文件中,但是当我执行 yarn/npm 启动时出现此错误:
Failed to compile.
./src/index.js
Cannot find file: 'index.js' does not match the corresponding name on disk: '/mnt/c/users/<my_username>/Projects/test_module/Users'.
无论出于何种原因,“/Users”都被添加到路径的末尾,我不知道为什么。我现在已经吹走了我的环境两次,而且它一直在发生。这是WSL的问题吗?是我配置有误吗?
编辑:'test_project' 是从 create-react-app 生成的,没有任何修改。如果您想知道我的环境是如何设置的。
EDIT2:我在 Window 的 CMD 中试过了,一切正常。所以看起来问题是由 WSL、我的节点安装以及其他任何问题的组合引起的:/
谢谢
我想出了解决问题的方法。您需要编辑 wsl 配置并将根设置为“/”。我的理论是某处正在使用相对路径,并且使用“/”作为根从路径中删除“/mnt/”,允许它正确地后退。但是,我无法用事实来支持它:D
无论如何,修复很容易。
sudo vim /etc/wsl.conf
然后添加此字段,使文件如下所示:
[automount]
root = /
options = "metadata"
(我有解决权限问题的选项字段)
然后完全logout/signout,重新登录,unlink模块,吹走node_modules文件夹,运行 npm install,然后重新link。届时应该一切正常。
干杯!
这个问题让我抓狂了很长时间,但我能够为我正在处理的项目解决它。 (不幸的是,重新安装 WSL root 并没有为我解决问题。)症状与原始问题中的症状 略有 不同,但我希望我发现的至少可以提供一些见解。
对我来说,这个问题是多种因素的结合。每当我尝试为某个项目 运行 react-scripts start
时,它就会发生。奇怪的是我在 WSL 中有另一个项目,其设置几乎相同 运行 没问题。
经过一些黑客攻击,我将问题缩小到 case-sensitive-paths-webpack-plugin that react-scripts
was using internally. By dropping a bunch of console.log()
statements in the fileExistsWithCase 方法,我能够查明问题的原因。
该方法确认磁盘上是否存在大小写与传递的字符串 (filepath
) 匹配的 file/directory。为此,它递归地检查路径中的每个目录。不幸的是,错误记录似乎有点损坏,因为当错误通过递归循环冒泡时,它会附加错误文件夹的名称,就好像它是原始文件名一样(报告为 an issue in the create-react-app repo)。
例如,原题的错误是
Cannot find file: 'index.js' does not match the corresponding name on disk: '/mnt/c/users/<my_username>/Projects/test_module/Users'.
在这种情况下,在递归几次后,库列出了 /mnt/c
中的所有内容,并且看到 users
目录不存在但 Users
目录存在,错误冒出并被错误地报告为 /mnt/c/users/<my_username>/Projects/test_module/Users
.
现在,在检查每个 file/directory 时,库首先检查其缓存。并且提前 primes the cache with the current working directory。这最终就是为什么我的一个项目成功而另一个却失败的原因。工作的项目使用 npm,所以 node_modules 的形式是 $PWD/node_modules/foo
,一旦达到 $PWD
就会停止递归。然而,另一个项目使用的是 pnpm,失败的依赖项被提升到更高的目录。在我的例子中,每当它试图验证我系统上名为 /mnt/c/Users/[username]/wslhome
的目录时,这些依赖项就会失败,它在磁盘上看到的是 WSLHome
。
我很幸运能够将 WSLHome
重命名为 wslhome
让我的项目工作起来。不幸的是 /mnt/c/Users
不会那么容易重命名,因为它是由 Windows 创建的。
总的来说,问题似乎主要取决于包依赖项的绝对路径是如何定义的,以及外壳是否与 Node path
所看到的相匹配。
更新:当我今天去使用这个项目时,它又开始失败了,这次是抱怨 "Users" 目录的大小写不正确。 -_- 所以看起来问题可能有些不一致。我看到一篇关于 updating case sensitivity options when using Windows directories 的文章,将 case=dir
添加到我的 wsl.conf 选项并重新启动子系统后,错误消失了。然而,鉴于其不一致的性质,我不能确定这是否是解决方案。
另一个可能相关的观察结果是,当 运行ning readlink -f
依赖于一个依赖目录时,差异似乎是可见的。有时结果有合适的大小写,有时则没有。 (例如,现在,readlink -f ~/dev
不正确 returns /mnt/c/users
的子目录,而 readlink -f .
正确地 returns /mnt/c/Users
的子目录,而在 ~/dev
目录。)