VS Code - 在虚拟机 (VM) 上使用代码 运行ner 扩展到 运行 程序

VS Code - Using Code Runner Extension to Run Programs on Virtual Machine (VM)

我通过 Vagrant 和 Virtual Box 使用 Linux 虚拟机在 Windows 上进行开发。我正在尝试弄清楚如何让 Code Runner 扩展到 运行 我在 VM 上的文件。到目前为止最大的障碍是,对于给定的文件,我需要从 Windows 主机路径转换为 ​​Linux 来宾路径。


背景:

Code Runner 扩展允许将文件类型映射到 shell 命令到 运行 这些文件。例如,

"java": "cd $dir && javac $fileName && java $fileNameWithoutExt"

告诉 Code Runner,当我尝试 运行 一个 Java 文件时,它应该 cd 到包含该文件的目录,并编译该文件,然后 运行编译后的文件。从文件类型到命令的映射称为 code-runner.executorMap,它包含在 settings.json 中。通过添加选项

"code-runner.runInTerminal": true

到我的settings.json,我可以在集成终端中告诉Code Runner到运行。因此,通过 vagrant ssh 从集成终端简单地 SSH 连接到我的虚拟机,我就有了针对虚拟机的代码 运行ner。

这就是问题所在 - Code Runner 使用我的 Windows 样式路径和我的 Windows 文件结构作为我的 VM 的命令行参数。

例如,假设我的 Windows 文件结构看起来像 c:\a\b\c\d 并且我的 VM 在 c 中有根,因此 cd 是共享文件夹。如果我想 运行 d 中的文件,命令 cd $dir 将告诉我的虚拟机执行 cd c:\a\b\c\d.

我想到了解决方法,比如将以下内容添加到我的设置中 运行 python 文件

"python": "cd \"$(dirname \"$(locate -l1 $fileName)\")\"; python3 $fileName",

此命令在集成终端(VM)上 运行 定位并更改到包含要 运行 的文件的目录。然后它告诉 python3 解释器 运行 该文件。但是,这并不总是有效(例如,多个文件具有相同的名称),并且每次添加文件时都需要更新 locate 所依赖的数据库。

必须有一些方法可以将我的 Windows 文件路径转换为虚拟机上的路径(例如 c:\a\b\c\d -> /c/d)。也许通过 Vagrant?我将不胜感激任何帮助。

我开发了一个解决方法。我仍然对 "cleaner" 解决方案感兴趣。


解决方法如下:

首先,我编写了一个 Python 脚本来将 Windows 路径转换为虚拟机上的路径。该脚本将文件的 windows 路径和文件名作为参数。

#pathconverter.py
import sys
windows_path=sys.argv[1]
file_name=sys.argv[2]

path_to_vagrantfile = r"C:\Users\Evan\Google Drive\Development\Vagrantfile"
slashes=path_to_vagrantfile.count("\")

y=windows_path.split("\")[slashes:]
linux_path="/vagrant/"+'/'.join(y) + "/" + file_name
print(linux_path)

因此,以下代码从 windows 文件位置转换为我的虚拟机上的文件位置(假设您将 pathconverter.py 保存在共享目录 \vagrant 的根目录下:

python3 \"/vagrant/pathconverter.py\" $dirWithoutTrailingSlash $fileName

因此,对于 运行 各种解释语言的大多数文件,我只是将此命令的输出作为参数提供给解释器。例如,要在我的 VM 上自动 运行 一个 Python 脚本,我只需将以下行添加到代码中 -runner.executorMap:

"python": "python3 \"$(python3 \"/vagrant/pathconverter.py\" $dirWithoutTrailingSlash $fileName)\""

或者对于 Racket/scheme,我只是这样做:

"scheme": "racket \"$(python3 \"/vagrant/pathconverter.py\" $dirWithoutTrailingSlash $fileName)\""