MSBuild:如何进一步证明导入项目路径?

时间:2017-04-21 15:50:30

标签: powershell msbuild msbuild-task msbuildcommunitytasks msbuild-propertygroup

几年前曾问过类似的question,但我想知道过渡期间是否有任何改变,或者人们是否有新想法如何做到这一点。

我已将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>

...但是如果我尝试使用上面的相同import语句导入,则会收到以下错误消息:

The value "" of the "Project" attribute in element <Import> is invalid.  Parameter "path" cannot have zero length.

这是我用尽的想法。如何避免在工具路径中对版本号进行硬编码?

1 个答案:

答案 0 :(得分:0)

我发现你需要手动导入一些东西很奇怪。 MSBuildTasks NuGet包中包含build\MSBuildTasks.targets。 Visual Studio应该自动将此文件的导入添加到.csproj文件中。

此导入路径由Visual Studio中的NuGet Package Manager维护。

因此,您应该能够使用所需的任务而无需手动导入任何内容。

如果它不起作用,请检查.csproj文件是否真的包含自动生成的导入到上面提到的正确的.targets文件。