msbuild:检查导入是否成功



我安装了MSBuild Community任务以使"Zip"任务可用。使用以下代码一切正常:

<Import Project="$(MSBuildExtensionsPath)MSBuildCommunityTasksMSBuild.Community.Tasks.Targets"/>

在尚未安装Community Tasks的计算机上,Visual Studio(Enterprise 2017)完全拒绝加载包含上述Import语句的.csproj文件。

由于zip相关部分不是构建过程中的重要步骤,我尝试在尚未安装Community任务的机器上加载.csproj,让msbuild发出警告,并使用条件构建zip相关目标。所以我尝试了:

<PropertyGroup>
<MSBuildCommunityTargets>$(MSBuildExtensionsPath)MSBuildCommunityTasksMSBuild.Community.Tasks.Targets</MSBuildCommunityTargets>
</PropertyGroup>     
<Import Project="$(MSBuildCommunityTargets)" Condition="Exists($(MSBuildCommunityTargets))" />

此处找不到社区任务目标文件。当社区任务安装到"程序文件(x86)"正下方的MSBuild文件夹中时,展开的$(MSBuildExtensionPath)路径指向VS安装文件夹下方的MSBbuild文件夹。我怀疑Import语句在扩展$(MSBuildExtensionPath)变量时会产生一些兼容性搜索魔法,而这种魔法不适用于简单的属性变量扩展。

是否有任何正确的方法来检查是否存在某些已安装的第三方MSBuild任务/目标?

谢谢。

是否有任何正确的方法来检查是否存在某些已安装的第三方MSBuild任务/目标?

您的Visual Studio版本必须是2017。这是因为展开的$(MSBuildExtensionsPath)路径指向MSBuild安装文件夹。Visual Studio 2015及之前版本的默认值为:C:Program Files (x86)MSBuild

但是对于Visual Studio 2017,它被更改为C:Program Files (x86)Microsoft Visual Studio2017EnterpriseMSBuild。并且MSBuild.Community.Tasks.msi的安装路径仍然是C:Program Files (x86)MSBuild。因此,当您在Visual Studio 2017中使用$(MSBuildExtensionsPath)指定社区任务的路径时,您将收到错误"找不到社区任务目标文件"。

为了解决此问题,在作者更新此MSI文件之前,我们无法在Visual Studio 2017中使用变量$(MSBuildExtensionsPath)。作为一种变通方法,您可以使用绝对路径:

<PropertyGroup>
<MSBuildCommunityTargets>C:Program Files (x86)MSBuildMSBuildCommunityTasksMSBuild.Community.Tasks.Targets</MSBuildCommunityTargets>
</PropertyGroup>     
<Import Project="$(MSBuildCommunityTargets)" Condition="Exists($(MSBuildCommunityTargets))" />

或者使用$(MSBuildProgramFiles32)而不是$(MSBuildExtensionsPath):

<PropertyGroup>
<MSBuildCommunityTargets>$(MSBuildProgramFiles32)MSBuildMSBuildCommunityTasksMSBuild.Community.Tasks.Targets</MSBuildCommunityTargets>
</PropertyGroup>  

或者,您可以通过NuGet软件包安装Community Tasks。因为MSBuild社区任务库也可以通过包名MSBuildTasks在nuget.org上获得。若要安装MSBuildTasks,请在Package Manager控制台中运行以下命令:

Install-Package MSBuildTasks

安装此软件包后,您可以在项目文件中找到以下导入:

<Import Project="..packagesMSBuildTasks.1.5.0.235buildMSBuildTasks.targets" Condition="Exists('..packagesMSBuildTasks.1.5.0.235buildMSBuildTasks.targets')" />

在这种情况下,您不需要再修改项目文件,它也不会被变量$(MSBuildExtensionsPath)绑定。这就是我们的建议。

是否有任何正确的方法来检查是否存在某些已安装的第三方MSBuild任务/目标?

你不能使用条件吗?多年来一直为我工作

<Import Project="$(MSBuildExtensionsPath)MSBuildCommunityTasksMSBuild.Community.Tasks.Targets" Condition="Exists('$(MSBuildExtensionsPath)MSBuildCommunityTasksMSBuild.Community.Tasks.Targets')" />

最新更新