1

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

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

这就是我没有想法的地方。如何避免在工具路径中硬编码版本号?

4

1 回答 1

0

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

而这个导入路径由 Visual Studio 中的 NuGet 包管理器维护。

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

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

于 2017-04-24T15:32:37.763 回答