使用 WSL2 与 Windows 上安装的应用交互

Interact with apps installed on Windows using WSL2

我启动了 WSL2 并 运行ning。在 Windows 级别我安装了 node.js,现在我想从 Ubuntu 级别 运行 npm install snowflake-sdk。终端 returns -bash: /mnt/c/Program Files/nodejs/npm: /bin/sh^M: bad interpreter: No such file or directory 而 PowerShell 工作正常。

问题是:是否可以使用 WSL2 的终端与 Windows 级别安装的应用程序进行交互?

> 是否可以使用 WSL2 的终端与 Windows 级别安装的应用程序进行交互?

是的,您可以从 WSL 运行 notepad.exe,它会在 Windows.

中打开记事本

更多文档:https://docs.microsoft.com/en-us/windows/wsl/interop#run-windows-tools-from-linux

解决 NPM 问题

如果我在 WSL 中尝试 运行ning npm -v,我会收到有关无法找到文件的错误消息:

PS C:\Users\harvey> bash
harvey@harvey-w10x64-defiance:/mnt/c/Users/harvey$ npm -v
internal/modules/cjs/loader.js:968
  throw err;
  ^

Error: Cannot find module 'C:\mnt\c\Program Files\nodejs\node_modules\npm\bin\npm-cli.js'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:965:15)
    at Function.Module._load (internal/modules/cjs/loader.js:841:27)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47 {
  code: 'MODULE_NOT_FOUND',
  requireStack: []
}

文件的路径大部分是正确的,但它附加了 C:\mnt

我通过 运行ning npm 给 Node npm-cli.js 文件的路径解决了这个问题。

你可以运行:

node.exe \c\Program Files\nodejs\node_modules\npm\bin\npm-cli.js -v

但是 运行 出现了同样的错误。

然后我尝试了这个:

PS C:\Users\harvey> bash
harvey@harvey-w10x64-defiance:/mnt/c/Users/harvey$ cd "/mnt/c/Program Files/nodejs/node_modules/npm/bin"
harvey@harvey-w10x64-defiance:/mnt/c/Program Files/nodejs/node_modules/npm/bin$ ../../../node.exe npm-cli.js -v
6.14.6

从这里我终于能够从 NPM CLI 获得一些输出。

我可以从这里安装包,但它可能会安装在错误的位置。

我似乎无法 npm 在文件系统的任何地方工作。这可能是 NPM 的限制。也许如果你尝试弄乱你的路径环境变量,你可以让它工作吗?

注:


提供了很好的背景信息。

可以从Windows-installed调用npmNode.js 从 WSL2 复制 工作,虽然它并不明显并且有点麻烦 - 尽管 你可以将解决方法包装在自定义函数或脚本中:

# From WSL2; note the required use of '.exe'
node.exe 'c:/Program Files/nodejs/node_modules/npm/bin/npm-cli.js' install snowflake-sdk

以上内容依赖于 Node.js 安装在 Windows 上的默认位置,调用 npm 间接 ,基本上使用Windows 上的 CLI 入口点 npm.cmd 批处理文件 使用的相同技术。

注:

  • 为了从 WSL 定位 Windows 可执行文件,您必须包含文件扩展名 显式 ,例如 node.exe 而不是 node.

  • 没有它,例如对于 npm,Linux 子系统在 $PATH 文件夹中查找具有该名称的 extension-less 文件,这 工作。

    • 这样的文件实际上确实甚至在Windows上也存在,但它是为[=67=设计的shebang-based脚本]Unix-like 平台,基本上只是 Windows 安装中的自重; Linux 子系统仍然尝试执行它,但失败了,因为它使用 CRLF (\r\n) 换行符而不是预期的 LF-only (\n) 换行符。结果, #!/bin/sh 之后的意外 CR(在错误消息中表示为 ^M)被认为是可执行路径 的一部分 ,因此调用失败.[1]

    • 即使手动修复该问题(转换为 LF-only 换行符)也无济于事,但是,因为 shell 脚本如何构建完整的npm-cli.js 入口点 的路径:它表示为尝试通过 WSL [=173] Windows file-system 位置 的 UNC 路径=] - 例如,
      \wsl$\Ubuntu-20.04\mnt\c\... - 明确不允许[2]

  • 调用 batch 文件,npm.cmd,明确地,也不起作用 - 既不直接也不用 cmd.exe /c npm.cmd ...:

    • *.cmd 文件的直接调用莫名其妙地失败了 - 不确定这是否是 Windows 10 20H2 的错误。
    • 通过 cmd.exe /c 它也失败了,因为 cmd.exe 不支持 UNC 路径作为当前目录,并且 WSL2 内部当前目录路径总是表示为一个(例如,\wsl$\Ubuntu-20.04\home\jdoe\project\some-project).
      在这种情况下,cmd.exe 默认为 Windows 目录 ,因此无法将包安装到当前 WSL 目录(项目)。
  • 将 npm CLI 的主 .js 文件的完整 Windows-native 路径提供给 node.exe,如上所示,按预期工作,因为 Node.js 似乎以其他方式处理引用 WSL2 file-system 目录和文件的 UNC 路径,例如调用 WSL2 的 shell 当前目录,正确。


[1] 在 Ubuntu 20.04 上,shebang 行本身 中的 CR 似乎不再是问题,但是剩余的行仍然是,所以调用仍然失败,甚至更模糊,错误消息如 : not foundram Files/nodejs/npm: 3:.

[2] 原因是 Linux dirname 实用程序用于确定 shell 脚本自己的目录,以便确定 npm-cli.js 的完整路径,此实用程序设计为从 Linux file-system 的角度运行,最终表达脚本的 Windows file-system 以这种间接、不受支持的方式定位。