Я пытаюсь настроить задачу Cake, которая будет использовать MsDeploy для синхронизации сценария powershell с удаленным сервером, а затем выполнить этот сценарий в качестве команды после синхронизации.
Проблема, с которой я сталкиваюсь, заключается в поискекомбинация кавычек и экранировок в файле тортов, позволяющая команде полностью перейти на powershell с правильно указанным путем к файлу, чтобы powershell мог найти скрипт;путь содержит пробелы.
Это кажется настолько сложным из-за цепочки выполнения, что эта команда проходит во время выполнения.Во-первых, потому что это написано на C #, строка должна быть дословной (@"command here"
) или экранировать все внутренние двойные кавычки с помощью \
.
Next Cake выполняет несколько операций с аргументами, хотя ни одна из них не показаласьвоздействовать на такие вещи, как цитирование и экранирование до тех пор, пока он фактически не дойдет до выполнения, после чего он использует статический метод C # Process.Start()
для запуска исполняемого файла MsDeploy.В моем чтении было предложено, чтобы этот метод запуска команды требовал правильного экранирования трех двойных кавычек, хотя это не совпало с тем, что я видел, когда пытался.
Затем один раз на удаленной машине MsDeployиспользует CMD.exe
для выполнения команды, которая, в частности, не поддерживает одинарные кавычки, поэтому двойные кавычки либо нужно экранировать, используя \"
или ""
.
Ближайшее, что я получил, выглядит так:
Task("InitializeIISApplication")
.IsDependentOn("InjectVariables")
.Does(() => {
MsDeploy(new MsDeploySettings
{
Verb = Operation.Sync,
RetryAttempts = 3,
RetryInterval = 10000,
Source = new FilePathProvider
{
Direction = Direction.source,
Path = MakeAbsolute(File(@".\MyPowershell.ps1")).ToString()
},
Destination = new FilePathProvider
{
Direction = Direction.dest,
Path = File(deployParameters.ApplicationDestinationPath + @"\MyPowershell.ps1").ToString(),
Username = deployParameters.MsDeployUserName,
Password = deployParameters.MsDeployUserPassword,
WebManagementService = deployParameters.DeploymentTargetUrl
},
AllowUntrusted = true,
EnableRules = new List<string> {
"DoNotDeleteRule"
},
PostSyncCommand = new CommandProvider {
AppendQuotesToPath = false,
Direction = Direction.dest,
Path = $"powershell -file '{deployParameters.ApplicationDestinationPath}\\MyPowershell.ps1' ",
}
});
MsDeploy(new MsDeploySettings
{
Verb = Operation.Delete,
Destination = new FilePathProvider
{
Direction = Direction.dest,
Path = File(deployParameters.ApplicationDestinationPath + "\MyPowershell.ps1").ToString(),
Username = deployParameters.MsDeployUserName,
Password = deployParameters.MsDeployUserPassword,
WebManagementService = deployParameters.DeploymentTargetUrl
},
AllowUntrusted = true
});
});
Зависимость задачи - это просто установка объекта deployParameters
.
, который при включенном многогранности диагностики Cake выдает в журналы следующую команду (новые строки добавлены для ясности):
"C:/Program Files/IIS/Microsoft Web Deploy V3/msdeploy.exe"
-verb:sync
-source:filePath="Y:/PathToBuildArtifact/Deploy/MyPowershell.ps1"
-dest:filePath="C:/Application - With Spaces/MyPowershell.ps1",wmsvc="https://deploy-server/msdeploy.axd",userName=msdeployuser,password=********
-enableRule:DoNotDeleteRule
-retryAttempts:3
-retryInterval:10000
-allowUntrusted
-postSync:runCommand="powershell -file 'C:\Application - With Spaces\MyPowershell.ps1' "
Затем завершается с ошибкой:
Предупреждение: Обработка -File '' C: / Application 'завершилась неудачно: формат данного пути не поддерживается.Укажите допустимый путь для параметра -File.
Любой вариант, в котором я пытался использовать двойные кавычки внутри команды postSync, вместо этого приводит к этой ошибке:
Ошибка: не распознанааргумент '-'.
Если это имеет значение, это делается на сервере Bamboo CI.