mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-06 18:20:52 +03:00
feat(epf-build): исходники проверяются платформой до сборки
Сборка .epf/.erf не компилирует модули, поэтому сломанный BSL уезжал пользователю и падал при открытии обработки. Прямой команды «проверь внешнюю обработку» у платформы нет, но объект конфигурации она проверяет: обработка кладётся в конфигурацию временной базы (stub-db-create -EmbedSourceFile) и спрашивается /CheckConfig. При находках сборка отменяется, в выводе — сообщение платформы и путь к файлу исходника. Ключи -Checks и -Context; выключение -Checks off или externalCheck: false в .v8-project.json. С выключенной проверкой поведение прежнее. У копии объекта перевыпускаются все GUID: с идентификаторами исходника платформа путает копию в базе с загружаемой внешней обработкой и через раз отвечает «Исключение XDTO при чтении файла» на исправном исходнике. Ручная матрица (база есть/нет × ps1/py × исправный/битый × с модулями/без) вскрыла ещё три вещи: отказ платформы принять исходники при подготовке проверки выдавался за сбой базы; py-порт стаба терял причину отказа LoadConfigFromFiles (не было /Out, в PS он есть); копии общих утилит в stub-db-create.py разошлись с эталоном db-create — у run_v8 не было POSIX-ветки, из-за чего на darwin/Linux временная база с пробелом в пути молча не находилась бы. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MQkqXxErBepYmoUycfkbn
This commit is contained in:
co-authored by
Claude Opus 5
parent
a3ea0b7be6
commit
448f05ed11
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"name": "Перед сборкой запускается /CheckConfig (fake platform)",
|
||||
"osOnly": "win32",
|
||||
"fakePlatform": {
|
||||
"exit": 0,
|
||||
"log": "Загрузка завершена.\n",
|
||||
"check": {
|
||||
"exit": 0,
|
||||
"log": ""
|
||||
}
|
||||
},
|
||||
"preRun": [
|
||||
{
|
||||
"script": "epf-init/scripts/init",
|
||||
"args": {
|
||||
"-Name": "Тест",
|
||||
"-SrcDir": "{workDir}/src"
|
||||
}
|
||||
}
|
||||
],
|
||||
"args_extra": [
|
||||
"-V8Path",
|
||||
"{workDir}\\fake.cmd",
|
||||
"-InfoBasePath",
|
||||
"{workDir}\\ib",
|
||||
"-SourceFile",
|
||||
"{workDir}\\src\\Тест.xml",
|
||||
"-OutputFile",
|
||||
"{workDir}\\build\\Тест.epf"
|
||||
],
|
||||
"expect": {
|
||||
"stdoutContains": [
|
||||
"/CheckConfig -ThinClient -Server -HandlersExistence",
|
||||
"/LoadExternalDataProcessorOrReportFromFiles"
|
||||
]
|
||||
},
|
||||
"expectError": true,
|
||||
"noSnapshot": "платформа фейковая, EPF не собирается — проверяется командная строка проверки"
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"name": "Находки проверки отменяют сборку (fake platform)",
|
||||
"osOnly": "win32",
|
||||
"fakePlatform": {
|
||||
"exit": 0,
|
||||
"log": "",
|
||||
"check": {
|
||||
"exit": 101,
|
||||
"log": "{Обработка.Тест.МодульОбъекта(5,1)}: Ожидается ключевое слово 'КонецФункции'\r\n"
|
||||
}
|
||||
},
|
||||
"preRun": [
|
||||
{
|
||||
"script": "epf-init/scripts/init",
|
||||
"args": {
|
||||
"-Name": "Тест",
|
||||
"-SrcDir": "{workDir}/src"
|
||||
}
|
||||
}
|
||||
],
|
||||
"args_extra": [
|
||||
"-V8Path",
|
||||
"{workDir}\\fake.cmd",
|
||||
"-InfoBasePath",
|
||||
"{workDir}\\ib",
|
||||
"-SourceFile",
|
||||
"{workDir}\\src\\Тест.xml",
|
||||
"-OutputFile",
|
||||
"{workDir}\\build\\Тест.epf"
|
||||
],
|
||||
"expect": {
|
||||
"stdoutContains": [
|
||||
"платформа нашла проблемы в исходниках",
|
||||
"МодульОбъекта(5,1)",
|
||||
"src\\Тест\\Ext\\ObjectModule.bsl"
|
||||
],
|
||||
"stdoutNotContains": [
|
||||
"/LoadExternalDataProcessorOrReportFromFiles"
|
||||
]
|
||||
},
|
||||
"expectError": true,
|
||||
"noSnapshot": "сборка отменена — артефакта нет по замыслу"
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
{
|
||||
"name": "ibcmd-аргументы не утекают в проверку (fake platform)",
|
||||
"osOnly": "win32",
|
||||
"preRun": [
|
||||
{
|
||||
"script": "epf-init/scripts/init",
|
||||
"args": {
|
||||
"-Name": "Тест",
|
||||
"-SrcDir": "{workDir}/src"
|
||||
}
|
||||
},
|
||||
{
|
||||
"writeFile": {
|
||||
"path": "ibcmd.cmd",
|
||||
"content": "@echo off\r\necho ARGS: %*\r\nexit /b 0\r\n",
|
||||
"executable": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"writeFile": {
|
||||
"path": "1cv8.cmd",
|
||||
"content": "@echo off\r\necho ARGS: %*\r\nexit /b 0\r\n",
|
||||
"executable": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"writeFile": {
|
||||
"path": "ib/1Cv8.1CD",
|
||||
"content": "stub\n"
|
||||
}
|
||||
}
|
||||
],
|
||||
"args_extra": [
|
||||
"-V8Path",
|
||||
"{workDir}\\ibcmd.cmd",
|
||||
"-InfoBasePath",
|
||||
"{workDir}\\ib",
|
||||
"-SourceFile",
|
||||
"{workDir}\\src\\Тест.xml",
|
||||
"-OutputFile",
|
||||
"{workDir}\\build\\Тест.epf",
|
||||
"-AdditionalIbcmdArguments",
|
||||
"--nonesuch=1"
|
||||
],
|
||||
"expect": {
|
||||
"stdoutContains": [
|
||||
"/CheckConfig -ThinClient -Server -HandlersExistence",
|
||||
"Running: ibcmd infobase config import"
|
||||
],
|
||||
"stdoutNotContains": [
|
||||
"/DisableStartupDialogs --nonesuch=1"
|
||||
]
|
||||
},
|
||||
"expectError": true,
|
||||
"noSnapshot": "платформа фейковая, EPF не собирается — проверяется состав командных строк"
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"name": "-Checks off отключает проверку (fake platform)",
|
||||
"osOnly": "win32",
|
||||
"fakePlatform": {
|
||||
"exit": 0,
|
||||
"log": "",
|
||||
"check": {
|
||||
"exit": 101,
|
||||
"log": "Не должно быть вызвано\n"
|
||||
}
|
||||
},
|
||||
"preRun": [
|
||||
{
|
||||
"script": "epf-init/scripts/init",
|
||||
"args": {
|
||||
"-Name": "Тест",
|
||||
"-SrcDir": "{workDir}/src"
|
||||
}
|
||||
}
|
||||
],
|
||||
"args_extra": [
|
||||
"-V8Path",
|
||||
"{workDir}\\fake.cmd",
|
||||
"-InfoBasePath",
|
||||
"{workDir}\\ib",
|
||||
"-SourceFile",
|
||||
"{workDir}\\src\\Тест.xml",
|
||||
"-OutputFile",
|
||||
"{workDir}\\build\\Тест.epf",
|
||||
"-Checks",
|
||||
"off"
|
||||
],
|
||||
"expect": {
|
||||
"stdoutContains": [
|
||||
"/LoadExternalDataProcessorOrReportFromFiles"
|
||||
],
|
||||
"stdoutNotContains": [
|
||||
"/CheckConfig"
|
||||
]
|
||||
},
|
||||
"expectError": true,
|
||||
"noSnapshot": "платформа фейковая, EPF не собирается — проверяется командная строка"
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"name": "Путь не печатается, если файла нет (fake platform)",
|
||||
"osOnly": "win32",
|
||||
"fakePlatform": {
|
||||
"exit": 0,
|
||||
"log": "",
|
||||
"check": {
|
||||
"exit": 101,
|
||||
"log": "{Обработка.Тест.МодульМенеджера(3,1)}: Ошибка\r\n"
|
||||
}
|
||||
},
|
||||
"preRun": [
|
||||
{
|
||||
"script": "epf-init/scripts/init",
|
||||
"args": {
|
||||
"-Name": "Тест",
|
||||
"-SrcDir": "{workDir}/src"
|
||||
}
|
||||
}
|
||||
],
|
||||
"args_extra": [
|
||||
"-V8Path",
|
||||
"{workDir}\\fake.cmd",
|
||||
"-InfoBasePath",
|
||||
"{workDir}\\ib",
|
||||
"-SourceFile",
|
||||
"{workDir}\\src\\Тест.xml",
|
||||
"-OutputFile",
|
||||
"{workDir}\\build\\Тест.epf"
|
||||
],
|
||||
"expect": {
|
||||
"stdoutContains": [
|
||||
"платформа нашла проблемы в исходниках",
|
||||
"МодульМенеджера(3,1)"
|
||||
],
|
||||
"stdoutNotContains": [
|
||||
"ManagerModule.bsl"
|
||||
]
|
||||
},
|
||||
"expectError": true,
|
||||
"noSnapshot": "сборка отменена — артефакта нет по замыслу"
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"name": "ibcmd без соседнего 1cv8: проверка пропускается, сборка идёт (fake platform)",
|
||||
"osOnly": "win32",
|
||||
"preRun": [
|
||||
{
|
||||
"script": "epf-init/scripts/init",
|
||||
"args": {
|
||||
"-Name": "Тест",
|
||||
"-SrcDir": "{workDir}/src"
|
||||
}
|
||||
},
|
||||
{
|
||||
"writeFile": {
|
||||
"path": "ibcmd.cmd",
|
||||
"content": "@echo off\r\necho ARGS: %*\r\nexit /b 0\r\n",
|
||||
"executable": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"writeFile": {
|
||||
"path": "ib/1Cv8.1CD",
|
||||
"content": "stub\n"
|
||||
}
|
||||
}
|
||||
],
|
||||
"args_extra": [
|
||||
"-V8Path",
|
||||
"{workDir}\\ibcmd.cmd",
|
||||
"-InfoBasePath",
|
||||
"{workDir}\\ib",
|
||||
"-SourceFile",
|
||||
"{workDir}\\src\\Тест.xml",
|
||||
"-OutputFile",
|
||||
"{workDir}\\build\\Тест.epf"
|
||||
],
|
||||
"expect": {
|
||||
"stdoutContains": [
|
||||
"[note] source check skipped",
|
||||
"Running: ibcmd infobase config import"
|
||||
],
|
||||
"stdoutNotContains": [
|
||||
"/CheckConfig"
|
||||
]
|
||||
},
|
||||
"expectError": true,
|
||||
"noSnapshot": "платформа фейковая, EPF не собирается — проверяется поведение без 1cv8 рядом"
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"name": "-Context без modules отбивается",
|
||||
"osOnly": "win32",
|
||||
"fakePlatform": {
|
||||
"exit": 0,
|
||||
"log": ""
|
||||
},
|
||||
"preRun": [
|
||||
{
|
||||
"script": "epf-init/scripts/init",
|
||||
"args": {
|
||||
"-Name": "Тест",
|
||||
"-SrcDir": "{workDir}/src"
|
||||
}
|
||||
}
|
||||
],
|
||||
"args_extra": [
|
||||
"-V8Path",
|
||||
"{workDir}\\fake.cmd",
|
||||
"-InfoBasePath",
|
||||
"{workDir}\\ib",
|
||||
"-SourceFile",
|
||||
"{workDir}\\src\\Тест.xml",
|
||||
"-OutputFile",
|
||||
"{workDir}\\build\\Тест.epf",
|
||||
"-Checks",
|
||||
"handlers",
|
||||
"-Context",
|
||||
"Server"
|
||||
],
|
||||
"expect": {
|
||||
"stdoutContains": [
|
||||
"-Context задан, но в -Checks нет modules"
|
||||
],
|
||||
"stdoutNotContains": [
|
||||
"/CheckConfig",
|
||||
"/LoadExternalDataProcessorOrReportFromFiles"
|
||||
]
|
||||
},
|
||||
"expectError": true,
|
||||
"noSnapshot": "отказ до запуска платформы"
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"name": "Отказ платформы при подготовке проверки не выдаётся за сбой базы (fake platform)",
|
||||
"osOnly": "win32",
|
||||
"fakePlatform": {
|
||||
"exit": 1,
|
||||
"log": ""
|
||||
},
|
||||
"preRun": [
|
||||
{
|
||||
"script": "epf-init/scripts/init",
|
||||
"args": {
|
||||
"-Name": "Тест",
|
||||
"-SrcDir": "{workDir}/src"
|
||||
}
|
||||
}
|
||||
],
|
||||
"args_extra": [
|
||||
"-V8Path",
|
||||
"{workDir}\\fake.cmd",
|
||||
"-SourceFile",
|
||||
"{workDir}\\src\\Тест.xml",
|
||||
"-OutputFile",
|
||||
"{workDir}\\build\\Тест.epf"
|
||||
],
|
||||
"expect": {
|
||||
"stdoutContains": [
|
||||
"платформа не приняла исходники"
|
||||
],
|
||||
"stdoutNotContains": [
|
||||
"failed to create stub database",
|
||||
"/LoadExternalDataProcessorOrReportFromFiles"
|
||||
]
|
||||
},
|
||||
"expectError": true,
|
||||
"noSnapshot": "платформа фейковая и падает на первом запуске — проверяется вердикт"
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"name": "Неизвестная проверка отбивается",
|
||||
"osOnly": "win32",
|
||||
"fakePlatform": {
|
||||
"exit": 0,
|
||||
"log": ""
|
||||
},
|
||||
"preRun": [
|
||||
{
|
||||
"script": "epf-init/scripts/init",
|
||||
"args": {
|
||||
"-Name": "Тест",
|
||||
"-SrcDir": "{workDir}/src"
|
||||
}
|
||||
}
|
||||
],
|
||||
"args_extra": [
|
||||
"-V8Path",
|
||||
"{workDir}\\fake.cmd",
|
||||
"-InfoBasePath",
|
||||
"{workDir}\\ib",
|
||||
"-SourceFile",
|
||||
"{workDir}\\src\\Тест.xml",
|
||||
"-OutputFile",
|
||||
"{workDir}\\build\\Тест.epf",
|
||||
"-Checks",
|
||||
"syntax"
|
||||
],
|
||||
"expect": {
|
||||
"stdoutContains": [
|
||||
"unknown check 'syntax'"
|
||||
],
|
||||
"stdoutNotContains": [
|
||||
"/CheckConfig",
|
||||
"/LoadExternalDataProcessorOrReportFromFiles"
|
||||
]
|
||||
},
|
||||
"expectError": true,
|
||||
"noSnapshot": "отказ до запуска платформы"
|
||||
}
|
||||
@@ -2,6 +2,13 @@
|
||||
"name": "Доп. аргументы доходят до самой сборки EPF (fake platform)",
|
||||
"osOnly": "win32",
|
||||
"preRun": [
|
||||
{
|
||||
"script": "epf-init/scripts/init",
|
||||
"args": {
|
||||
"-Name": "Тест",
|
||||
"-SrcDir": "{workDir}/src"
|
||||
}
|
||||
},
|
||||
{
|
||||
"writeFile": {
|
||||
"path": "fake.cmd",
|
||||
@@ -13,12 +20,6 @@
|
||||
"path": "ib/1Cv8.1CD",
|
||||
"content": "fake infobase\n"
|
||||
}
|
||||
},
|
||||
{
|
||||
"writeFile": {
|
||||
"path": "src/Обработка.xml",
|
||||
"content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<MetaDataObject xmlns=\"http://v8.1c.ru/8.3/MDClasses\"/>\n"
|
||||
}
|
||||
}
|
||||
],
|
||||
"args_extra": [
|
||||
@@ -27,9 +28,9 @@
|
||||
"-InfoBasePath",
|
||||
"{workDir}\\ib",
|
||||
"-SourceFile",
|
||||
"{workDir}\\src\\Обработка.xml",
|
||||
"{workDir}\\src\\Тест.xml",
|
||||
"-OutputFile",
|
||||
"{workDir}\\build\\Обработка.epf",
|
||||
"{workDir}\\build\\Тест.epf",
|
||||
"-AdditionalV8Arguments",
|
||||
"/UseHwLicenses+"
|
||||
],
|
||||
|
||||
@@ -3,15 +3,16 @@
|
||||
"osOnly": "win32",
|
||||
"preRun": [
|
||||
{
|
||||
"writeFile": {
|
||||
"path": "fake.cmd",
|
||||
"content": "@echo off\r\necho ARGS: %*\r\nexit /b 1\r\n"
|
||||
"script": "epf-init/scripts/init",
|
||||
"args": {
|
||||
"-Name": "Тест",
|
||||
"-SrcDir": "{workDir}/src"
|
||||
}
|
||||
},
|
||||
{
|
||||
"writeFile": {
|
||||
"path": "src/Обработка.xml",
|
||||
"content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<MetaDataObject xmlns=\"http://v8.1c.ru/8.3/MDClasses\"/>\n"
|
||||
"path": "fake.cmd",
|
||||
"content": "@echo off\r\necho ARGS: %*\r\nexit /b 1\r\n"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -19,9 +20,9 @@
|
||||
"-V8Path",
|
||||
"{workDir}\\fake.cmd",
|
||||
"-SourceFile",
|
||||
"{workDir}\\src\\Обработка.xml",
|
||||
"{workDir}\\src\\Тест.xml",
|
||||
"-OutputFile",
|
||||
"{workDir}\\build\\Обработка.epf",
|
||||
"{workDir}\\build\\Тест.epf",
|
||||
"-AdditionalV8Arguments",
|
||||
"/UseHwLicenses+"
|
||||
],
|
||||
|
||||
@@ -72,7 +72,7 @@ const FAMILIES = [
|
||||
// хранилища — задача одна, поэтому семья общая, а не вторая с тем же телом.
|
||||
{ id: 'full', authority: 'cf-edit',
|
||||
consumers: ['cfe-borrow', 'db-cfe-admin', 'db-dump-xml', 'db-load-cf', 'db-load-git', 'db-load-xml', 'db-repo', 'db-update',
|
||||
'form-add', 'form-compile', 'form-edit', 'help-add', 'interface-edit', 'meta-compile',
|
||||
'epf-build', 'form-add', 'form-compile', 'form-edit', 'help-add', 'interface-edit', 'meta-compile',
|
||||
'meta-edit', 'meta-remove', 'mxl-compile', 'role-compile', 'skd-compile', 'skd-edit',
|
||||
'subsystem-compile', 'subsystem-edit', 'template-add', 'xdto-compile', 'xdto-edit'] },
|
||||
],
|
||||
|
||||
@@ -376,13 +376,14 @@ function buildArgs(skillConfig, caseData, workDir, inputFilePath, runtime) {
|
||||
// Второй ответ — на проверку применимости расширения: навык запускает её ОТДЕЛЬНЫМ процессом
|
||||
// (в одной командной строке платформа выполнила бы только последнюю команду), поэтому фейк
|
||||
// отличает проверку по составу аргументов, а не по номеру вызова.
|
||||
const FAKE_PLATFORM_CMD = "@echo off\r\nrem SELF запоминаем ДО цикла: shift сдвигает и %0, после него %~dp0 указывает не на скрипт\r\nset SELF=%~dp0\r\nset KIND=main\r\n:loop\r\nif \"%~1\"==\"\" goto done\r\nif /i \"%~1\"==\"/Out\" set OUT=%~2\r\nif /i \"%~1\"==\"/CheckCanApplyConfigurationExtensions\" set KIND=check\r\nshift\r\ngoto loop\r\n:done\r\nif \"%KIND%\"==\"check\" if exist \"%SELF%log_check.txt\" (copy /y \"%SELF%log_check.txt\" \"%OUT%\" >nul & exit /b CHECKCODE)\r\ncopy /y \"%SELF%log.txt\" \"%OUT%\" >nul\r\nexit /b EXITCODE\r\n";
|
||||
const FAKE_PLATFORM_SH = "#!/bin/sh\n# Фейк платформы для *nix: вычитывает путь из /Out и кладёт туда готовый лог.\n# Значение /Out несёт кавычки ВНУТРИ токена (соглашение 1С, см. run_v8) — в batch их\n# снимает %~2, в sh их надо снять руками, иначе cp целится в имя с кавычками.\nSELF=$(dirname \"$0\")\nOUT=\"\"\nKIND=main\nwhile [ $# -gt 0 ]; do\n if [ \"$1\" = \"/CheckCanApplyConfigurationExtensions\" ]; then\n KIND=check\n fi\n if [ \"$1\" = \"/Out\" ]; then\n OUT=\"$2\"\n OUT=\"${OUT#\\\"}\"\n OUT=\"${OUT%\\\"}\"\n fi\n shift\ndone\nif [ \"$KIND\" = check ] && [ -f \"$SELF/log_check.txt\" ]; then\n cp \"$SELF/log_check.txt\" \"$OUT\"\n exit CHECKCODE\nfi\ncp \"$SELF/log.txt\" \"$OUT\"\nexit EXITCODE\n";
|
||||
const FAKE_PLATFORM_CMD = "@echo off\r\nrem SELF запоминаем ДО цикла: shift сдвигает и %0, после него %~dp0 указывает не на скрипт\r\nset SELF=%~dp0\r\nset KIND=main\r\n:loop\r\nif \"%~1\"==\"\" goto done\r\nif /i \"%~1\"==\"/Out\" set OUT=%~2\r\nif /i \"%~1\"==\"/CheckCanApplyConfigurationExtensions\" set KIND=check\r\nif /i \"%~1\"==\"/CheckConfig\" set KIND=check\r\nshift\r\ngoto loop\r\n:done\r\nif \"%KIND%\"==\"check\" if exist \"%SELF%log_check.txt\" (copy /y \"%SELF%log_check.txt\" \"%OUT%\" >nul & exit /b CHECKCODE)\r\ncopy /y \"%SELF%log.txt\" \"%OUT%\" >nul\r\nexit /b EXITCODE\r\n";
|
||||
const FAKE_PLATFORM_SH = "#!/bin/sh\n# Фейк платформы для *nix: вычитывает путь из /Out и кладёт туда готовый лог.\n# Значение /Out несёт кавычки ВНУТРИ токена (соглашение 1С, см. run_v8) — в batch их\n# снимает %~2, в sh их надо снять руками, иначе cp целится в имя с кавычками.\nSELF=$(dirname \"$0\")\nOUT=\"\"\nKIND=main\nwhile [ $# -gt 0 ]; do\n if [ \"$1\" = \"/CheckCanApplyConfigurationExtensions\" ] || [ \"$1\" = \"/CheckConfig\" ]; then\n KIND=check\n fi\n if [ \"$1\" = \"/Out\" ]; then\n OUT=\"$2\"\n OUT=\"${OUT#\\\"}\"\n OUT=\"${OUT%\\\"}\"\n fi\n shift\ndone\nif [ \"$KIND\" = check ] && [ -f \"$SELF/log_check.txt\" ]; then\n cp \"$SELF/log_check.txt\" \"$OUT\"\n exit CHECKCODE\nfi\ncp \"$SELF/log.txt\" \"$OUT\"\nexit EXITCODE\n";
|
||||
|
||||
function writeFakePlatform(workDir, spec) {
|
||||
const isWin = process.platform === 'win32';
|
||||
const code = Number.isInteger(spec.exit) ? spec.exit : 0;
|
||||
// spec.check — ответ на проверку применимости расширения (отдельный запуск платформы)
|
||||
// spec.check — ответ платформы на отдельный запуск проверки
|
||||
// (/CheckCanApplyConfigurationExtensions у расширений, /CheckConfig у внешних обработок)
|
||||
const checkCode = spec.check && Number.isInteger(spec.check.exit) ? spec.check.exit : 0;
|
||||
const body = (isWin ? FAKE_PLATFORM_CMD : FAKE_PLATFORM_SH)
|
||||
.replaceAll('EXITCODE', String(code))
|
||||
|
||||
Reference in New Issue
Block a user