Аналогичный вопрос был спросил несколько лет назад, но мне интересно, изменилось ли что-нибудь за это время и есть ли у людей новые идеи, как это сделать.
Я импортировал MSBuildTasks (задачи сообщества MSBuild) как пакет Nuget в проект в моем решении. Я могу определить свойство для пути к файлу .targets следующим образом:
<PropertyGroup>
<MSBuildTasks>$(SolutionDir)Packages\MSBuildTasks.1.5.0.235\tools\MSBuild.Community.Tasks.Targets</MSBuildTasks>
</PropertyGroup>
... а затем импортируйте его, используя:
<Import Project="$(MSBuildTasks)"/>
Конечно, я могу обновить пакет позже, и в этом случае имя папки изменится, поэтому я бы предпочел избегать жесткого кодирования номера версии. Один из способов, который я придумал избежать этого, заключался в том, чтобы сценарий PowerShell искал последнюю версию:
function Find-PackagePath
{
[CmdletBinding()]
param(
[Parameter(Position=0,Mandatory=1)]$packagesPath,
[Parameter(Position=1,Mandatory=1)]$packageName
)
return (Get-ChildItem ($packagesPath + "\" + $packageName + "*")).FullName | Sort-Object $_ | select -Last 1
}
... и введите это как свойство командной строки для MSBuild:
msbuild $solutionFile "/p:Configuration=$buildConfiguration;Platform=$buildPlatform;MSBuildTasks=$MSBuildTasks";
Я могу подтвердить сообщением, что введенный путь действительно передается моей цели:
<Target Name="_ReportMSBuildTasksPath" BeforeTargets="_ComputeSemanticVersion">
<Message Text="MSBUILDTASKS = $(MSBuildTasks)"/>
</Target>
... но если я попытаюсь импортировать, используя тот же оператор импорта, указанный выше, я получаю следующее сообщение об ошибке:
The value "" of the "Project" attribute in element <Import> is invalid. Parameter "path" cannot have zero length.
Вот где у меня заканчиваются идеи. Как я могу избежать жесткого кодирования номера версии в пути к инструментам?
MSBuildTasks
в общий файл, скажемPaths.props
, который находится в хорошо известном месте в вашем исходном дереве, затем импортируйте этот файл в любой другой файл проекта, где вам нужен путь. По крайней мере, вам тогда нужно будет обновить только одно место. - person Christian.K   schedule 21.04.2017