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

时间:2018-09-08 15:38:47

标签: visual-studio-code vagrant virtual-machine vagrant-windows

我通过Vagrant和Virtual Box使用Linux VM在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进入我的VM,我就可以将代码运行器定位到虚拟机。

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

例如,假设我的Windows文件结构看起来像c:\a\b\c\d,并且我的VM的根位于c中,因此cd是共享文件夹。如果我想在d中运行文件,则命令cd $dir将告诉我的VM执行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)。也许通过流浪汉?我将不胜感激任何帮助。

1 个答案:

答案 0 :(得分:0)

我开发了一种解决方法。我仍然会对“更清洁”的解决方案感兴趣。


解决方法如下:

首先,我编写了一个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脚本,只需将以下行添加到code-runner.executorMap中:

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

或者对于球拍/方案,我只是这样做:

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