msbuild:检查导入是否成功

时间:2017-11-02 14:31:20

标签: visual-studio msbuild

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

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>

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

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

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

此处无法找到社区任务目标文件。扩展的$(MSBuildExtensionsPath)路径指向VS安装文件夹下的MSBuild文件夹,而社区任务安装到“Program Files(x86)”正下方的MSBuild文件夹中。我怀疑在扩展$(MSBuildExtensionsPath)变量时,Import语句会执行一些兼容性搜索魔法,而此魔法不会应用于简单的属性变量扩展。

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

谢谢。

2 个答案:

答案 0 :(得分:2)

  

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

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

但是,对于Visual Studio 2017,它已更改为C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuildMSBuild.Community.Tasks.msi的安装路径仍为C:\Program Files (x86)\MSBuild。 因此,当您使用$(MSBuildExtensionsPath) Visual Studio 2017 中指定社区任务的路径时,您将收到错误&#34;无法找到社区任务目标文件&#34;。< / p>

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

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

或使用$(MSBuildProgramFiles32)代替$(MSBuildExtensionsPath)

<PropertyGroup>
     <MSBuildCommunityTargets>$(MSBuildProgramFiles32)\MSBuild\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets</MSBuildCommunityTargets>
</PropertyGroup>  

或者,您可以按NuGet包安装社区任务。因为MSBuild社区任务库也可以通过包名MSBuildTasks在nuget.org上获得。要安装MSBuildTasks,请在程序包管理器控制台中运行以下命令:

Install-Package MSBuildTasks

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

<Import Project="..\packages\MSBuildTasks.1.5.0.235\build\MSBuildTasks.targets" Condition="Exists('..\packages\MSBuildTasks.1.5.0.235\build\MSBuildTasks.targets')" />

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

答案 1 :(得分:0)

  

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

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

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