我通过Vagrant和Virtual Box使用Linux VM在Windows上进行开发。我正在尝试弄清楚如何让代码运行程序扩展在 VM 上运行我的文件。到目前为止,最大的障碍是,对于给定的文件,我需要从 Windows 主机路径转换为 Linux 来宾路径。
背景:
代码运行程序扩展允许将文件类型映射到 shell 命令以运行这些文件。例如
"java": "cd $dir && javac $fileName && java $fileNameWithoutExt"
告诉代码运行程序,当我尝试运行 Java 文件时,它应该cd
到包含该文件的目录,编译该文件,然后运行编译的文件。从文件类型到命令的映射称为包含在settings.json
中的code-runner.executorMap
。通过添加选项
"code-runner.runInTerminal": true
到我settings.json
,我可以告诉代码运行程序在集成终端中运行。因此,只需通过vagrant ssh
从集成终端 SSH 进入我的 VM,我就有了针对虚拟机的代码运行程序。
这就是问题所在 - 代码运行程序使用我的 Windows 样式路径和我的 Windows 文件结构作为我的 VM 的命令行参数。
例如,假设我的 Windows 文件结构看起来像c:abcd
,并且我的 VM 的根目录在c
,因此c
和d
是共享文件夹。如果我想在d
中运行文件,命令cd $dir
将告诉我的 VM 执行cd c:abcd
操作。
我已经想到了解决方法,例如将以下内容添加到我的设置中以运行 python 文件
"python": "cd "$(dirname "$(locate -l1 $fileName)")"; python3 $fileName",
此命令在集成终端(VM(上运行,用于查找并更改包含要运行的文件的目录。然后它告诉 python3 解释器运行该文件。但是,这并不总是有效(例如,具有相同名称的多个文件(,并且每次添加文件时都需要更新locate
依赖的数据库。
必须有某种方法可以将我的 Windows 文件路径转换为虚拟机上的路径(例如c:abcd
->/c/d
(。也许通过流浪汉?我将不胜感激任何帮助。
我开发了一个解决方法。我仍然对"更清洁"的解决方案感兴趣。
解决方法如下:
首先,我编写了一个 Python 脚本,用于从 Windows 路径转换为虚拟机上的路径。该脚本将文件的窗口路径和文件名作为参数。
#pathconverter.py
import sys
windows_path=sys.argv[1]
file_name=sys.argv[2]
path_to_vagrantfile = r"C:UsersEvanGoogle DriveDevelopmentVagrantfile"
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 脚本,只需将以下行添加到 code-runner.executorMap 中:
"python": "python3 "$(python3 "/vagrant/pathconverter.py" $dirWithoutTrailingSlash $fileName)""
或者对于球拍/计划,我只是做:
"scheme": "racket "$(python3 "/vagrant/pathconverter.py" $dirWithoutTrailingSlash $fileName)""