VS Code - Использование Code Runner Extension для запуска программ на виртуальной машине (ВМ) - PullRequest
0 голосов
/ 08 сентября 2018

Я разрабатываю на Windows, используя виртуальную машину Linux через Vagrant и Virtual Box. Я пытаюсь выяснить, как получить расширение Code Runner для запуска моих файлов на виртуальной машине. Самым большим препятствием на данный момент является то, что для данного файла мне нужно преобразовать путь хоста Windows в гостевой путь Linux.


Справочная информация:

Расширение Code Runner позволяет сопоставлять типы файлов командам оболочки для запуска этих файлов. Например,

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

сообщает Code Runner, что когда я пытаюсь запустить файл Java, он должен cd перейти в каталог, в котором находится файл, и скомпилировать файл, а затем запустить скомпилированный файл. Отображение типов файлов в команды называется code-runner.executorMap, которое содержится в settings.json. Добавив опцию

"code-runner.runInTerminal": true

на мой settings.json, я могу сказать Code Runner, чтобы он работал во встроенном терминале. Поэтому, просто подключив SSH к моей виртуальной машине через встроенный терминал через vagrant ssh, я получаю программу запуска кода, предназначенную для виртуальной машины.

Вот в чем проблема: Code Runner использует мои пути в стиле Windows и мои файловые структуры Windows в качестве аргументов командной строки для моей виртуальной машины.

Например, предположим, что моя файловая структура Windows выглядит как c:\a\b\c\d, а моя виртуальная машина имеет корень в c, поэтому c и d являются общими папками. Если я хочу запустить файл в d, команда cd $dir скажет моей виртуальной машине сделать cd c:\a\b\c\d.

Я думал об обходных путях, таких как добавление следующего в мои настройки для запуска файлов python

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

Эта команда, которая выполняется на встроенном терминале (ВМ), находит и переходит в каталог, содержащий файл, который должен быть запущен. Затем он говорит интерпретатору python3 запустить этот файл. Однако это не всегда работает (например, несколько файлов с одним и тем же именем) и требует от меня обновления базы данных, от которой зависит locate каждый раз, когда я добавляю файл.

Должен быть какой-то способ перевести мои пути к файлам Windows в пути на виртуальной машине (например, c:\a\b\c\d -> /c/d). Возможно через Vagrant? Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 09 сентября 2018

Я разработал обходной путь.Я все еще был бы заинтересован в "более чистом" решении.


Временное решение заключается в следующем:

Во-первых, я написал скрипт 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

Поэтому, чтобы запустить большинство файлов на различных интерпретируемых языках, я просто предоставляю вывод этой команды в качестве аргумента для интерпретатора. Например, чтобы автоматически запустить скрипт Python на моей виртуальной машине, я просто добавляю следующую строку вcode-runner.executorMap:

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

Или для Ракетки / схемы я просто делаю:

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