H20rider
H20rider

Reputation: 2282

MSBuild - Circular dependency in the target dependency graph

I am getting the following error in my build

Error MSB4006: There is a circular dependency in the target dependency graph involving target "DoPublish".

The DoPublish is triggering Publish and I assume the Build. How can I avoid this.

I am using the Visual Studio build. I was using the MSBUILD with the targets /t:UpdateVersion;DoPublish;publish, which worked. I would like to use the Visual Studio build in TFS instead of MSBUILD

Project:

<Target Name="UpdateVersion"  AfterTargets="PostBuildEvent">
    <RevisionTask>
      <Output TaskParameter="PublishVersion" PropertyName="PublishVersion" />
    </RevisionTask>
    <Message Text="The Version is $(PublishVersion)" Importance="high" />
    <PropertyGroup>
      <ApplicationVersion>$(PublishVersion)</ApplicationVersion>
    </PropertyGroup>
    <ItemGroup>
      <ConfigFile Include="$(MSBuildProjectDirectory)\Configs\$(Configuration)\AppDeploy.config" />
    </ItemGroup>
    <Copy SourceFiles="@(ConfigFile)" DestinationFolder="$(TargetDir)" Condition=" '$(Configuration)' == 'DEV' OR '$(Configuration)' == 'SIT' OR '$(Configuration)' == 'UAT' " ContinueOnError="true" />
    <Copy SourceFiles="@(ConfigFile)" DestinationFolder="$(MSBuildProjectDirectory)" Condition=" '$(Configuration)' == 'DEV' OR '$(Configuration)' == 'SIT' OR '$(Configuration)' == 'UAT' " ContinueOnError="true" />
    <Message Text="Copying File from $(MSBuildProjectDirectory)\Configs\$(Configuration)\Web.config to $(TargetDir)" Importance="high" />
  </Target>
<Target Name="DoPublish" AfterTargets="UpdateVersion"  Condition=" '$(BuildingInsideVisualStudio)' != '' ">
    <MSBuild Projects="$(ProjectFileName)"    Targets="Publish"    Properties="ApplicationVersion=$(PublishVersion)" />
    <!-- Write publish.htm file for ClickOnce -->
    <Message Text="FileUpdate - $(ProjectDir)\Configs\publish.htm:  Replace {PublishVersion} with $(PublishVersion)" Importance="high" />
    <FileUpdate Files="$(ProjectDir)\Configs\publish.htm" IgnoreCase="true" Multiline="true" Singleline="false" Regex="{PublishVersion}" ReplacementText="$(PublishVersion)" />
    <Message Text="FileUpdate - $(ProjectDir)\Configs\publish.htm:  Replace {AssemblyName} with $(AssemblyName)" Importance="high" />
    <FileUpdate Files="$(ProjectDir)\Configs\publish.htm" IgnoreCase="true" Multiline="true" Singleline="false" Regex="{AssemblyName}" ReplacementText="$(AssemblyName)" />
    <Message Text="FileUpdate - $(ProjectDir)\Configs\publish.htm:  Replace {ProductName} with $(ProductName)" Importance="high" />
    <FileUpdate Files="$(ProjectDir)\Configs\publish.htm" IgnoreCase="true" Multiline="true" Singleline="false" Regex="{ProductName}" ReplacementText="$(ProductName)" />
    <Copy SourceFiles="$(ProjectDir)\Configs\publish.htm" DestinationFiles="$(PublishDir)publish.htm" />
  </Target>

Upvotes: 1

Views: 2897

Answers (2)

H20rider
H20rider

Reputation: 2282

After seeing this post I came up with similar solution overriding the AfterPubish target.

To correct the circular dependency, just change the target name to AfterPublish and removed the AfterTargerts attribute.

<Target Name="AfterPublish"  Condition=" '$(BuildingInsideVisualStudio)' != '' ">
    <MSBuild Projects="$(ProjectFileName)"    Targets="Publish"    Properties="ApplicationVersion=$(PublishVersion)" />
    <!-- Write publish.htm file for ClickOnce -->
    <Message Text="FileUpdate - $(ProjectDir)\Configs\publish.htm:  Replace {PublishVersion} with $(PublishVersion)" Importance="high" />
    <FileUpdate Files="$(ProjectDir)\Configs\publish.htm" IgnoreCase="true" Multiline="true" Singleline="false" Regex="{PublishVersion}" ReplacementText="$(PublishVersion)" />
    <Message Text="FileUpdate - $(ProjectDir)\Configs\publish.htm:  Replace {AssemblyName} with $(AssemblyName)" Importance="high" />
    <FileUpdate Files="$(ProjectDir)\Configs\publish.htm" IgnoreCase="true" Multiline="true" Singleline="false" Regex="{AssemblyName}" ReplacementText="$(AssemblyName)" />
    <Message Text="FileUpdate - $(ProjectDir)\Configs\publish.htm:  Replace {ProductName} with $(ProductName)" Importance="high" />
    <FileUpdate Files="$(ProjectDir)\Configs\publish.htm" IgnoreCase="true" Multiline="true" Singleline="false" Regex="{ProductName}" ReplacementText="$(ProductName)" />
    <Copy SourceFiles="$(ProjectDir)\Configs\publish.htm" DestinationFiles="$(PublishDir)publish.htm" />
  </Target>

Upvotes: 1

Eddie Chen - MSFT
Eddie Chen - MSFT

Reputation: 29976

I created a web app project and tested this on my environment (TFS2015) with following of your code kept:

<Target Name="UpdateVersion" AfterTargets="PostBuildEvent">
    <Message Text="The Version is $(PublishVersion)" Importance="high" />
    <PropertyGroup>
      <ApplicationVersion>$(PublishVersion)</ApplicationVersion>
    </PropertyGroup>
    <Message Text="Copying File from $(MSBuildProjectDirectory)\Configs\$(Configuration)\Web.config to $(TargetDir)" Importance="high" />
  </Target>
  <Target Name="DoPublish" AfterTargets="UpdateVersion" Condition="'$(BuildingInsideVisualStudio)' != 'true'">
    <MSBuild Projects="$(ProjectFileName)" Targets="Publish" />
  </Target>

But I couldn't reproduce this issue. The build can be completed successfully. I can only see MSB4006 error when "Target="Publish" isn't added in "DoPublish" target.

I changed Condition=" '$(BuildingInsideVisualStudio)' != '' " to Condition="'$(BuildingInsideVisualStudio)' != 'true'" as the BuildingInsideVisualStudio value is always empty under my environment. "DoPublish" target does not run with Condition=" '$(BuildingInsideVisualStudio)' != '' ".

Since I cannot add comment, I have a question need to check here: What do you mean by using the Visual Studio build in TFS instead of MSBUILD?

Upvotes: 1

Related Questions