【问题标题】:MSBuild Community Tasks not found未找到 MSBuild 社区任务
【发布时间】:2012-07-24 08:48:30
【问题描述】:

我有MyLib 库项目以及几个示例。库和示例在同一个解决方案MySolution

MyLib 库项目中,我包含了 MSBuild 代码来压缩整个解决方案并复制到另一个目录以进行 Internet 发布。

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
  <Target Name="AfterBuild" Condition="'$(Configuration)' == 'Release'">
    <PropertyGroup>
      <ReleasePath>C:\Users\Administrator\Projects\CA\Libraries\Api-DotNet\</ReleasePath>
      <ZipFile>C:\Users\Administrator\Projects\CA\WebProject\libraries\Api-DotNet.zip</ZipFile>
    </PropertyGroup>
    <ItemGroup>
      <LibraryFiles Include="$(ReleasePath)\**\*.*" Exclude="$(ReleasePath)\**\*.user;$(ReleasePath)\**\*.suo;$(ReleasePath)\Api.*;$(ReleasePath)\**\packages\**;$(ReleasePath)\**\Lib.Test\**;$(ReleasePath)\**\*.nuspec;$(ReleasePath)\**\*.nupkg;$(ReleasePath)\**\*nuget*;$(ReleasePath)\**\*internal*;$(ReleasePath)\**\*ReSharper*\**;$(ReleasePath)\**\.svn\**;$(ReleasePath)\**\obj\**;$(ReleasePath)\lib\bin\Debug\**;$(ReleasePath)\lib\bin\Publish\**;$(ReleasePath)\Example\**\bin\**;" />
    </ItemGroup>
    <Zip Files="@(LibraryFiles)" WorkingDirectory="$(ReleasePath)" ZipFileName="$(ZipFile)" ZipLevel="9" />
  </Target>  
</Project>

问题是当用户下载库并在另一台计算机上运行时,编译器显示错误,即找不到导入库MSBuild.Community.Tasks.Targets。我想在构建解决方案时从项目文件中排除 ZipAndCopy 代码。该怎么做?

【问题讨论】:

    标签: c# visual-studio-2010 msbuild


    【解决方案1】:

    将此Condition 添加到ImportZip 元素中:

    Condition="Exists('$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Commu‌​nity.Tasks.Targets')"
    

    例如:

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

    与此类似:C# Checking if a Property 'Starts/Ends With' in a csproj

    【讨论】:

    • 您可能需要添加引号才能使事情正常运行,例如:Condition="Exists('$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets')"
    【解决方案2】:

    上述解决方案隐藏了项目文件加载错误,但 Tomas 似乎正在尝试使用 MSBuild.Community.Tasks 扩展中的任务。

    这应该可以使用 NuGet 进行安装。这是源站点的link,显示我们可以通过 NuGet 的包命令行安装它:

    PM> Install-Package MSBuildTasks
    

    他们的文档不是很好。您还需要使用以下方法定义路径:

    <Import Project="..\Packages\MSBuildTasks.1.4.0.88\tools\MSBuild.Community.Tasks.Targets"/>
    <UsingTask AssemblyFile="..\Packages\MSBuildTasks.1.4.0.88\tools\MSBuild.Community.Tasks.Targets.dll"
             TaskName="MSBuild.Community.Tasks.Zip" />
    

    ...您需要将版本替换为您在 NuGet 中使用的版本。它并不完美,但我设法让我的工作正常。

    NuGet 会将其安装到解决方案/项目主干根目录下的“Packages”文件夹中。

    我遇到了 Visual Studio 可能仍在努力在特定位置查找文件的问题。如果发生这种情况,请将文件从 '.\Packages\MSBuildTasks.1.4.0.88\tools*' 复制到 'C:\Program Files (x86)\MSBuild\MSBuildCommunityTasks\'强>。

    这不是最优雅的,但我能够成功地让新标签工作。如果我找到解决最后一部分的方法,我会更新我的帖子。

    【讨论】:

      【解决方案3】:

      听起来您需要多个构建配置。我建议设置一个专门用于构建和压缩工件,并为您的用户单独设置一个。

      Release ZIP 可能是您的构建,带有构建后事件来压缩您的文件,Release 可能是一个普通构建,它不使用社区任务做任何特殊的事情。

      【讨论】:

      • 我的 MSBuild 脚本中有两个 IMPORTS。如何将它们移动到指定配置,例如 Release Zip?
      • 你可以Condition他们,比如Target元素已经有了,或者根据Preet Sangha的回答。 =)
      • 我不确定这是否解决了他在编译代码时“未找到”MSBuild.Community.Tasks.Targets 的原因。 MSBuild.Community.Tasks.Targets 是 Visual Studio 2010 的社区扩展,必须通过 NuGet 添加。一旦你通过 NuGet 添加它,它应该会在用户尝试编译时自动下载和安装。
      猜你喜欢
      • 2012-01-09
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多