Как правильно экранировать каталог при использовании psake, exec и msbuild? - PullRequest
2 голосов
/ 13 октября 2011

Я могу выполнить следующую команду в PowerShell:

msbuild "c:\some\spaced path\project.sln" /p:MvcBuildViews=False /p:OutDir="c:\\some\\spaced path\\deploy\\Package\\"

Пути изменены, но реальные также содержат разделенный компонент.Двойная косая черта - это трюк, например, этот ответ .

Если я запускаю это напрямую, msbuild понимает путь.Тем не менее, он должен работать в psake следующим образом:

exec { msbuild $SolutionFile "/p:MvcBuildViews=False;OutDir=$OutputDir" }

Это работает, если путь не имеет пробелов, но я хочу адаптировать его для работы с пробелами (как для пути sln, так и для OutDir).Я пытался, но я не мог понять выход.

РЕДАКТИРОВАТЬ:

Чтобы уточнить, это также работает, если я жестко закодировать полный путь в psake:

exec { msbuild "c:\some\spaced path\project.sln" /p:MvcBuildViews=False /p:OutDir="c:\\some\\spaced path\\deploy\\Package\\" }

Однако для этого необходимо использовать переменную OutputDir (которая не является двойным слэшем).Итак, я добавляю временную переменную для этого, а затем пытаюсь создать командную строку .:

$double_slashed_dir = $OutputDir.Replace('\', '\\');
write $double_slashed_dir;
exec { msbuild $SolutionFile /p:MvcBuildViews=False "/p:OutDir=`"$double_slashed_dir`"" }

Это не работает (я пробовал пару вариантов).С учетом вышесказанного я получаю «MSB1008: можно указать только один проект».

Ответы [ 5 ]

2 голосов
/ 17 октября 2011

Этот вариант работал для меня (двойные и конечные слэши в $OutputDir кажутся важными):

task build {
    $SolutionFile = "C:\TEMP\spaced path\ConsoleApplication1.sln"
    $OutputDir = "C:\\TEMP\\spaced path2\\"
    exec { msbuild $SolutionFile "/p:MvcBuildViews=False;OutDir=$OutputDir" }
}
0 голосов
/ 26 января 2012

Я тоже с этим боролся, и ответ, который я наконец-то нашел: процитировать весь ключ, а не только путь.

Так, например:

$buildBranch = "a path/with multiple/spaces in/"

# Use an array of arguments for common build settings, note: no trailing slash after Apps
$buildSettings = (
    ('"/Property:SolutionDir=' + $buildBranch + '\My Apps"'),
    '/t:Build', 
    '/p:PlatformTarget=x86', 
    '/p:Configuration=Release')

# Combine the common build settings with the specific project
$arg = $buildSettings + @('"' + $buildBranch + '\My Apps\MyProjectPath\MyProject.vcxproj"')

exec {
    &$msbuild $arg
}

Ключевое различие между этой и всеми моими другими попытками заключается в цитировании переключателя / Property.

Первоначально я сделал:

'/Property:SolutionDir="' + $buildBranch + '\My Apps"'

Обратите внимание, что двойная кавычка, которую я хочу передать в msbuild, появляется после имени переключателя и перед значением.

MsBuild увидит:

/Property:SolutionDir="some path\with spaces\My Apps"

Это не сработало.

Я изменил его на:

'"/Property:SolutionDir=' + $buildBranch + '\My Apps"'

MsBuild увидит:

"/Property:SolutionDir=some path\with spaces\My Apps"

Это сработалоработа!

0 голосов
/ 16 октября 2011

Я попробовал это со следующим, и это сработало.Единственное, что я добавил, это двойная кавычка (") после команды msbuild. Вот что я пробовал:

properties{
    $build_Dir="F:\projects\tweet sharp\src";
}

Task Default -depends Build


Task Build {
        Exec { msbuild "$build_Dir\TweetSharp.sln" }
}

Как вы можете видеть, каталог сборки содержит пробел ('tweet sharp')Просто попробуйте заключить все параметры задачи msbuild в двойные кавычки и проверьте, работает ли она.

0 голосов
/ 17 октября 2011

У меня это работает с Invoke-Expression:

$double_slashed_dir = $OutputDir.Replace('\', '\\');
$msbuild_command = 'msbuild "' + $SolutionFile + '" /p:MvcBuildViews=False /p:OutDir="' + $double_slashed_dir + '"';
exec { Invoke-Expression $msbuild_command }

Я считаю это немного хакерским. Это требует конкатенации строк, и, насколько я могу судить, Invoke-Expression в основном eval (хотя это должно быть безопасно, так как здесь не вводится никакой пользовательский ввод).

Так что я оставляю вопрос открытым пока в надежде на лучший ответ. Он должен четко показывать переменные.

0 голосов
/ 14 октября 2011

Вы хотите поместить кавычки вокруг вашего OutDir, но использование одинарных кавычек приведет к путанице синтаксического анализа командной оболочки из-за других кавычек в вашем аргументе, поэтому вам нужно экранировать эти кавычки, заключив их в двойные кавычки:

exec { msbuild $SolutionFile "/p:MvcBuildViews=False;OutDir=`"`"$OutputDir`"`"" }
...