MSBuild: как перейти к будущему импорту пути к проекту?

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

Я импортировал 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.

Вот где у меня заканчиваются идеи. Как я могу избежать жесткого кодирования номера версии в пути к инструментам?


comment
Я могу понять рассуждения, но вы должны спросить себя: действительно ли смена версии так часто / распространена, что стоит лишних сложностей? Если вы поместите свойство MSBuildTasks в общий файл, скажем Paths.props, который находится в хорошо известном месте в вашем исходном дереве, затем импортируйте этот файл в любой другой файл проекта, где вам нужен путь. По крайней мере, вам тогда нужно будет обновить только одно место.   -  person Christian.K    schedule 21.04.2017
comment
Это вроде как зависит от того, на сколько дополнительной сложности мы рассматриваем. Я использую ряд других инструментов вместе с MSBuildTasks (хотя, к счастью, они не требуют импорта!), Последние версии которых автоматически обнаруживаются этим сценарием и передаются как аргументы командной строки. Само по себе ведение MSBuildTasks вручную не такая уж и большая проблема, но я хотел бы привести его в порядок, опять же при условии, что усилия не будут монументальными. Наличие дополнительных инструментов для решения проблем такого рода, вероятно, будет иметь большее значение для будущего, чем конкретная проблема, которую я ищу здесь.   -  person ket    schedule 21.04.2017
comment
Справедливо. Лично в моих файлах проекта я должен поддерживать от 3 до 4 таких путей (OpenCover и т. Д.) Из пакетов NuGet. Я использую подход, описанный выше. YMMV, конечно ;-)   -  person Christian.K    schedule 21.04.2017


Ответы (1)


Мне показалось странным, что нужно что-то вручную импортировать. Пакет MSBuildTasks NuGet включает build\MSBuildTasks.targets. И Visual Studio должна автоматически добавить импорт этого файла в ваш файл .csproj.

И этот путь импорта поддерживается диспетчером пакетов NuGet в Visual Studio.

Итак, вы просто должны иметь возможность использовать нужные вам задачи, ничего не импортируя вручную.

Если это не сработает, убедитесь, что файл .csproj действительно включает автоматически сгенерированный импорт в соответствующий .targets файл, упомянутый выше.

person Igor Labutin    schedule 24.04.2017
comment
На самом деле я создаю собственный файл .targets, который надеюсь установить с помощью пакета nuget; эта цель будет использоваться другими проектами, и она должна иметь возможность импортировать цель MSBuildTasks. Файл nuspec будет указывать MSBuildTasks как зависимость, что, как мне кажется, означает, что при установке я получу либо указанную версию, либо более новую версию. Таким образом, будет указан путь импорта, но я не уверен, что могу гарантировать, что это всегда будет конкретная версия, которую я установил. - person ket; 26.04.2017