【问题标题】:msbuild: Check if Import was successfulmsbuild:检查导入是否成功
【发布时间】:2018-04-15 02:59:22
【问题描述】:

我安装了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 文件夹中。我怀疑 Import 语句在扩展 $(MSBuildExtensionsPath) 变量时会产生一些兼容性搜索魔法,而这种魔法不适用于简单的属性变量扩展。

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

谢谢。

【问题讨论】:

  • @Chirs M,这个问题有什么更新吗?你的问题解决了吗?如果没有,请告诉我有关此问题的最新信息。
  • @Leo-MSFT,非常感谢您提供的各种方法。由于我们的项目已经包含一个自写的命令行工具,暴露了在构建、安装和运行我们的产品期间使用的许多功能,我决定在那里添加所需的 zip 功能,并从 msbuild 调用我们自己的命令行工具进行压缩。
  • 没关系。顺便说一句,我的回答是否解决了您的问题“是否有任何适当的方法来检查是否存在一些已安装的第三方 MSBuild 任务/目标?”,如果是,您可以将其标记为答案,以便它可以帮助其他社区成员获得同样的问题。如果没有,您可以分享有关此问题的更多详细信息。谢谢。

标签: visual-studio msbuild


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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。 所以当你在Visual Studio 2017中使用$(MSBuildExtensionsPath)指定社区任务的路径时,你会得到“找不到社区任务目标文件”的错误。

    为解决此问题,在作者更新此 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)绑定。这是我们推荐的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多