几年前有人问过类似的问题,但我想知道在此期间是否有任何变化,或者人们是否有新的想法如何做到这一点。
我已将 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.
这就是我没有想法的地方。如何避免在工具路径中硬编码版本号?