无法从WSL中的npm / yarn链接加载链接的模块

时间:2019-04-04 00:36:00

标签: javascript windows npm yarnpkg windows-subsystem-for-linux

在尝试将本地依赖项导入到我的项目时,我遇到了一个非常奇怪的问题。

我有一个名为“ test_project”的项目,另一个将被链接为“ test_module”的项目。我将测试模块链接到全局node_modules文件夹(我尝试过npm链接和yarn链接)。然后在test_project中,我链接了test_module。我将test_module导入index.js文件,但是当我执行yarn / npm start时出现此错误:

decoded_text = ""
for code in refined_code:
    for key, value in codebook.items():
        if value == code:
            decoded_text += key

return decoded_text

无论出于什么原因,“ / Users”都被添加到路径的末尾,我也不知道为什么。我已经两次吹走我的环境,而且这种情况一直在发生。这是WSL的问题吗?我的配置有问题吗?

编辑:“ test_project”是从create-react-app生成的,没有任何修改。如果您想知道如何设置我的环境。

EDIT2:我在Window的CMD中尝试了此操作,并且一切正常。因此,问题似乎是由WSL,我的节点安装以及其他所有因素共同造成的:/

谢谢

2 个答案:

答案 0 :(得分:0)

我想出了解决问题的方法。您需要编辑wsl配置,并将根目录设置为“ /”。我的理论是在使用相对路径的某处,并以'/'作为根将路径中的'/ mnt /'删除,从而使其能够正确退后。但是,我不能用事实:D

来支持它

无论如何,修复很容易。

sudo vim /etc/wsl.conf

然后添加此字段,使文件如下所示:

[automount]

root = /
options = "metadata"

(我在此处有用于解决权限问题的选项字段)

然后完全注销/注销,重新登录,取消链接模块,吹散node_modules文件夹,运行npm install,然后重新链接。一切都应该在那个时候起作用。

干杯!

答案 1 :(得分:0)

这个问题困扰了我很长时间,但是我能够为我正在从事的项目解决它。 (不幸的是,重新安装WSL根目录并不能解决我的问题。)这些症状与原始问题略有不同,但我希望我所发现的至少可以提供一些启示。

对我来说,这个问题是多种因素共同作用的结果。每当我尝试为某个项目运行react-scripts start时,就会发生这种情况。奇怪的是,我在WSL中还有另一个项目,运行几乎完全相同。

经过一番黑客攻击后,我将问题缩小到react-scripts内部使用的case-sensitive-paths-webpack-plugin。通过在fileExistsWithCase方法中删除一堆console.log()语句,我可以查明问题的原因。

该方法确认磁盘上是否存在与传递的字符串(filepath)匹配的文件/目录。为此,它递归检查路径中的每个目录。不幸的是,错误日志记录似乎有点中断,因为当错误在递归循环中冒出时,它将错误文件夹的名称附加为原始文件名(报告为an issue in the create-react-app repo)。 / p>

例如,原始问题的错误是

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文件。

现在,当检查每个文件/目录时,库首先检查其缓存。并提前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选项并重新启动子系统后,错误消失了。但是,鉴于其本质不一致,我无法确定这是否是解决方案。

另一个可能与之相关的观察结果是,对依赖项目录运行readlink -f时,差异似乎很明显。有时结果具有适当的大小写,有时则没有。 (例如,现在readlink -f ~/dev不正确地返回/mnt/c/users的子目录,而readlink -f ./mnt/c/Users目录中正确地返回了~/dev的子目录。)< / p>

相关问题