MSBuild社区任务未找到。

15

我有一个名为MyLib的库项目,其中包含多个示例。该库和示例都在同一解决方案MySolution中。

MyLib库项目中,我编写了MSBuild代码以将整个解决方案压缩并复制到另一个目录以用于互联网发布。

<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代码。如何做到这一点?

3个回答

13

将此 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# 检查 csproj 文件中的属性是否以特定字符串开头或结尾


你可能需要添加引号以使事情正常工作,例如:Condition="Exists('$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets')" - Alexander

7
上述解决方案隐藏了项目文件加载错误,但Tomas似乎正在尝试使用来自MSBuild.Community.Tasks扩展的任务。
这可以通过使用NuGet进行安装来实现。以下是一个链接,显示我们可以通过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中正在使用的版本替换Version。它不是完美的,但我成功地让我的工作。

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

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

这不是最优雅的方法,但我成功地让新标签起作用。如果我找到解决此问题的方法,我会更新我的帖子。


3
听起来你需要多个构建配置。我建议设置一个专门用于构建和压缩构件的配置,另一个专门给用户使用。 Release ZIP 可以是一个包含后置构建事件用于压缩文件的构建,而 Release 则可以是一个普通的构建,不使用任何特殊的社区任务。

我在我的MSBuild脚本中有两个IMPORTS。如何将它们移动到指定的配置,例如Release Zip? - Tomas
1
你可以像Target元素一样对它们进行Condition,也可以参考Preet Sangha的回答。=) - J. Steen
我不确定这是否修复了编译代码时出现“未找到”MSBuild.Community.Tasks.Targets的原因。MSBuild.Community.Tasks.Targets是Visual Studio 2010的社区扩展,必须通过NuGet添加。一旦您通过NuGet添加它,当用户尝试编译时,它应该自动下载和安装。 - justdan23

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接