我安装了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任务/目标?
谢谢。
答案 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\MSBuild
。MSBuild.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')" />