terminal.integrated.profiles.windows" для изменения значения системной переменной path по умолчанию у встроенного терминала и при запуске задач.Изначально, я искал это решение именно для той цели, но потом подумал для примера добавить выполнение команд некоторых действий при запуске.
В той публикации видно, что всё работает, текст выводится, префикс ввода меняется.
Однако, на этом плюсы заканчиваются.
Когда я попробовал запустить задачу типа shell, они оказались сломанными.
С чего бы тут начать объяснение...
Ну, начну с того, что тут есть две причастные стороны.
Почему-то cmd не поддерживает выполнение нескольких команд, разделённых аргументами командной строки.
У cmd довольно большой список аргументов, поэтому я покажу сокращённый пример синтаксиса и ключей, которые я использовал, полный список вы можете сами посмотреть в документации.
cmd [/c|/k] [/d] [<string>]
В синтаксисе не указано, что есть возможность выполнения нескольких
[<string>], а если запускать несколько cmd подряд, то это не будет иметь нужного эффекта, так как они не будут наследовать переменные среды друг друга, так как являются независимыми процессами.При запуске задач типа shell vs code использует полный путь до исполняемого файла терминала или его оболочки и какие-то аргументы по умолчанию, после этого он добавляет command и args из описания задачи.
И при изменении args для профиля терминала через параметр "
terminal.integrated.profiles.windows", vs code почему-то просто конкатенирует новые аргументы с аргументами по умолчанию, хотя такое поведение кажется нелогичным.Например, так выглядит команда по умолчанию при запуске shell задачи с command "
echo" c args "world" :C:\windows\System32\cmd.exe /d /c echo world
А если добавить переопределение аргументов запуска терминала:
"terminal.integrated.profiles.windows":
{
"Command Prompt":
{
"path":
[
"${env:windir}\\Sysnative\\cmd.exe",
"${env:windir}\\System32\\cmd.exe",
],
"args":
[
// "/k",
"/c",
"echo",
"hello",
],
"icon": "terminal-cmd",
},
},
То vs code почему-то пытается выполнить такую команду:
C:\windows\System32\cmd.exe /k /c echo hello /d /c echo world
Хорошо, что это не влияет на process задачи, но тогда возникает вопрос, а зачем тогда все эти изменения аргументов командной строки в профиле терминала.
Если бы cmd имел синтаксис "
cmd [/c|/k] [/d] [<string>] [/c|/k] [/d] [<string>]..." или vs code при переопределении настроек профиля терминала добавлял только command и args из задачи без конкатенации аргументов терминала по умолчанию, то это бы работало, но увы.Поэтому я не рекомендую использовать предложенный мной способ для cmd.exe.
Если вы используете другие терминалы или их оболочки, посмотрите shell integration в документации vs code.
А если вам нужно только добавить или изменить переменные среды, то я нашёл настройку "
terminal.integrated.env.windows", которая работает просто идеально: влияет как на встроенный терминал, так и на задачи вида shell и process, и не ломает их:"terminal.integrated.env.windows":
{
"path": "C:\\HELLO;${env:path}",
},
Кстати, в vs code можно создавать свои пользовательские настройки, которые через переменные можно использовать в других конфигах vs code.
И несмотря на то, что в редакторе кода пользовательские настройки будут наполовину серыми по причине "Unknown Configuration Setting", они всё равно будут прекрасно работать.
Например, настройку "
terminal.integrated.env.windows" можно объединить с пользовательскими настройками, и получится что-то такое:"mySettings.compilerPath": "C:\\compiler\\bin",
"mySettings.gitPath": "C:\\git\\bin",
"mySettings.pythonPath": "C:\\python\\bin",
"mySettings.customPath": "${config:mySettings.compilerPath};${config:mySettings.gitPath};${config:mySettings.pythonPath};${env:path}",
"terminal.integrated.env.windows":
{
"path": "${config:mySettings.customPath}",
},
ссылка на канал | ссылка на группу
