【问题标题】:Using Visual Studio build getting error "MSB4006: There is a circular dependency in the target dependency graph involving target "Build"."使用 Visual Studio 构建时出现错误“MSB4006:在涉及目标“构建”的目标依赖关系图中存在循环依赖。”
【发布时间】:2017-09-13 10:33:10
【问题描述】:

我们正在尝试让 Team Foundation Server 2017 自动生成构建,到目前为止,我们一直只使用 Visual Studio 来构建和发布,但现在让 Team Foundation Server 执行此操作,我们遇到了循环依赖问题。

我们正在使用 Visual Studio 构建步骤。

解决方案中有多个项目 (.sln)。

该项目因引用了另外两个没有直接或间接引用该项目的项目而崩溃。

我已经翻遍了一篇描述如何追踪此循环引用的文章,但到目前为止我发现的所有内容都在谈论 MSBuild,或者它与目标“发布”或“构建”以外的其他东西有问题。

错误:

[错误]D:\VS2017\MSBuild\Microsoft\VisualStudio\v15.0\Web\Microsoft.Web.Publishing.targets(1279,11):

错误 MSB4006:目标依赖中存在循环依赖 涉及目标“构建”的图表。

项目 "D:\Agent\2.112.0_work\2\s\SLNNAME\SLNNAME.sln" (1) 是 建筑 "D:\Agent\2.112.0_work\2\s\SLNNAME\Inventory\Inventory.csproj" (17) 在节点 1(默认目标)上。

D:\VS2017\MSBuild\Microsoft\VisualStudio\v15.0\Web\Microsoft.Web.Publishing.targets(1279,11): 错误MSB4006:目标依赖中存在循环依赖 涉及目标“构建”的图表。

[D:\Agent\2.112.0_work\2\s\SLNNAME\Inventory\Inventory.csproj]

完成建筑项目 "D:\Agent\2.112.0_work\2\s\SLNNAME\Inventory\Inventory.csproj" (默认目标)--失败。

完成构建项目“D:\Agent\2.112.0_work\2\s\SLNNAME\SLNNAME.sln” (默认目标)--失败。

构建失败。

这是我在 .sln 文件中的构建目标:

<Target Name="OverrideAppConfigWithTargetPath">
    <ItemGroup>
      <AppConfigWithTargetPath Remove="@(AppConfigWithTargetPath)" />
      <AppConfigWithTargetPath Include="$(TransformedConfig)" Condition="'$(TransformedConfig)'!=''">
        <TargetPath>$(TargetFileName).config</TargetPath>
      </AppConfigWithTargetPath>
    </ItemGroup>
  </Target>
  <Target Name="CopyTransformedConfig" Condition="'$(TargetName)' != ''">
    <Copy Condition="Exists('$(TransformedConfig)')" SourceFiles="$(TransformedConfig)" DestinationFiles="$(OutputPath)$(TargetName)$(TargetExt).config" />
    <Copy Condition="Exists('$(TransformedConfig)') And '$(TargetExt)' == '.exe'" SourceFiles="$(TransformedConfig)" DestinationFiles="$(OutputPath)$(TargetName).vshost.exe.config" />
  </Target>
  <Target Name="AfterPublish">
    <PropertyGroup>
      <DeployedConfig>$(_DeploymentApplicationDir)$(TargetName)$(TargetExt).config$(_DeploymentFileMappingExtension)</DeployedConfig>
    </PropertyGroup>
    <Copy Condition="Exists('$(DeployedConfig)')" SourceFiles="$(TransformedConfig)" DestinationFiles="$(DeployedConfig)" />
  </Target>
  <Import Project="..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets'))" />
  </Target>

【问题讨论】:

  • 这个解决方案可以在你本地的Visual Studio中成功构建吗?您可以分享一个解决方案示例来重现您的问题吗?或者你能解释一下“它引爆的项目引用了另外两个没有直接或间接引用这个项目的项目。”
  • 是的,它在 Visual Studio 中构建良好,但不使用 TFS Visual Studio 构建任务。我上面评论的意思是项目 1 引用了项目 2 和项目 3,但他们都没有添加对项目 1 的引用。我不确定如何创建您要求的示例,这些都是很多的一部分更大的 sln,我无法分享...
  • 你能把 3 个项目的 .csproj 文件分享给我,让我检查一下。您可以将它们上传到here
  • 好的,我添加了一个带有这三个文件的 zip 文件作为 .txt 文件。 INV_Project 是我在构建时遇到的问题,另外两个是它引用的项目。这两个都被同一个 sln 中的其他几个项目引用,它们都工作正常。我已经编辑了很多,所以如果您需要任何具体的内容,请告诉我...这是一个驱动器共享链接:1drv.ms/u/s!Aj0zHV10Vai5gZQOg0S2ZARa1YGSTg
  • 请在您的构建代理服务器上使用MSBuild命令构建解决方案(D:\Agent\2.112.0_work\2\s\SLNNAME\SLNNAME.sln),错误是否仍然存在?跨度>

标签: c# tfs msbuild


【解决方案1】:

我遇到了同样的问题。

这对我有帮助:

https://community.embarcadero.com/blogs/entry/how-to-fix-msbuild-error-msb4006-38787

我在上次签入的项目中添加了一个后期构建,不知何故,项目依赖项也被添加到了 .sln 中。

它在 VS 中构建得很好,但在 TFS 构建中却不行。

我刚刚撤消了对解决方案的最后更改(请参阅链接,删除新的依赖组)。

ProjectSection(ProjectDependencies) = postProject
    {9D6D8692-16DD-452C-9D08-1498B3D51A9F} = {9D6D8692-16DD-452C-9D08-1498B3D51A9F}
    {9BE28BBA-B3F6-4076-B989-3B1B48DACF38} = {9BE28BBA-B3F6-4076-B989-3B1B48DACF38}
EndProjectSection

不知道这是否能解决您的问题,在谷歌搜索过程中,我发现了许多类似的问题,但原因/解决方案却大相径庭。

【讨论】:

    【解决方案2】:

    此错误发生在以下情况:

    1. 您在安装了 .NET 4.5 的计算机上运行 MSBuild
    2. 您构建的项目引用了一个解决方案,其中 SLN 文件包含 SLN 中的依赖项。

    如果您在解决方案资源管理器中右键单击项目,选择项目依赖项,然后开始检查项目,这些依赖项就是您将获得的依赖项。这通常是不必要的,因为可以从参考中推断出项目依赖关系。 解决方法是在您喜欢的文本编辑器中打开 SLN 文件,然后搜索如下部分:

    Project("{AAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyProjectName", "MyProjectName\MyProjectName.csproj", "{B10E1FCF-DFBA-44A8-830F-6F3B54DFA7CB}"

    ProjectSection(ProjectDependencies) = postProject
    
        {B9E9F8CE-A607-4A6C-97F7-2BD439122F89} = {B9E9F8CE-A607-4A6C-97F7-2BD439122F89}
    
    EndProjectSection
    

    结束项目

    只需删除整个部分,您的项目节点将如下所示:

    Project("{AAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyProjectName", "MyProjectName\MyProjectName.csproj", "{B10E1FCF-DFBA-44A8-830F-6F3B54DFA7CB}"

    结束项目

    现在您应该可以成功使用 MSBuild。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多