node.js - 使用 WSL2 与安装在 Windows 上的应用程序交互

标签 node.js powershell terminal snowflake-cloud-data-platform windows-subsystem-for-linux

我启动并运行了 WSL2。在 Windows 级别,我安装了 node.js,现在我想运行 npm install snowflake-sdk从 Ubuntu 级别。终端返回 -bash: /mnt/c/Program Files/nodejs/npm: /bin/sh^M: bad interpreter: No such file or directory而 PowerShell 工作正常。
问题是:是否可以使用 WSL2 的终端与 Windows 级别安装的应用程序进行交互?

最佳答案

笔记:

  • 比较典型的场景是安装Node.js和npm在 Linux 端 ,根据 the official instructions谢谢,SeaDude .如果您需要从 Windows 调用,您可以使用wsl npm ... ,但请注意 跨文件系统调用是 generally discouraged in WSL2 .

  • harzvor's helpful answer提供了很好的背景信息。
    可以调用npm来自 WSL2 工作的 Windows 安装的 Node.js 副本,虽然它不明显且有点麻烦 - 虽然 您可以将解决方法包装在自定义函数或脚本中 :
    # From WSL2; note the required use of '.exe'
    node.exe 'c:/Program Files/nodejs/node_modules/npm/bin/npm-cli.js' install snowflake-sdk
    
    上述依赖于安装在 Windows 上默认位置的 Node.js,调用 npm间接地,使用与 Windows 上的 CLI 入口点基本相同的技术,npm.cmd批处理文件,使用。
    笔记:
  • 为了从 WSL 定位 Windows 可执行文件,您必须明确包含文件扩展名,例如 node.exe而不是 node .
  • 没有它,例如与 npm ,Linux 子系统会在 $PATH 中查找具有该名称的无扩展名文件。文件夹,这不起作用。
  • 即使在 Windows 上也确实存在这样的文件,但它是为类 Unix 平台设计的基于 shebang 的脚本,基本上只是 Windows 安装中的自重; Linux 子系统仍然尝试执行它,但失败了,因为它使用 CRLF ( \r\n ) 换行符而不是预期的 LF-only ( \n ) 换行符。结果,#!/bin/sh 后面的意外CR (在错误消息中表示为 ^M)被认为是可执行路径的一部分,因此调用失败。 [1]
  • 然而,即使手动修复该问题(转换为仅 LF 换行符)也无济于事,因为 shell 脚本如何构造到 npm-cli.js 的完整路径入口点:它将它表示为一个 UNC 路径,该路径尝试通过 WSL 文件系统定位 Windows 文件系统位置 - 例如,\\wsl$\Ubuntu-20.04\mnt\c\... - 这是明确不允许的。 [2]

  • 调用批处理文件,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 主要的完整 Windows 本地路径 .js文件到 node.exe ,如上所示,按预期工作 ,因为 Node.js 似乎正在处理引用 WSL2 文件系统目录和文件的 UNC 路径,例如调用 WSL2 的 shell 当前目录。

  • [1] 在Ubuntu 20.04上,shebang行中的CR本身似乎不再是问题,但其余行中的CR仍然存在,因此调用仍然失败,更隐晦的是,出现了诸如: not foundram Files/nodejs/npm: 3:之类的错误信息。 .
    [2] 原因是Linux dirname实用程序用于确定shell脚本自己的目录以确定npm-cli.js的完整路径,并且此实用程序设计为从 Linux 文件系统的角度运行,最终以这种间接的、不受支持的方式表达脚本的 Windows 文件系统位置。

    关于node.js - 使用 WSL2 与安装在 Windows 上的应用程序交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64742172/

    相关文章:

    macos - 在命令行中运行docker镜像:复制+粘贴代码后遇到错误

    debugging - 如何清除 LLDB 控制台

    macos - GCC运行汇编程序mac?

    node.js - 如何在 Expressjs 中制作可重用的函数代码?

    javascript - 如何构造嵌套的 Promise

    powershell - JobDSL 中的多行 powershell 命令

    路径中带有 Get-ChildItem 和通配符的 Powershell 奇怪行为

    node.js - 与 Monaca 聊天应用程序

    javascript - 我可以在 Node 服务器停止后调用 $modal.open

    powershell - 如何使用 PowerShell 将当前日期计算为自 1601-01-01 以来的毫秒数