Skip to content
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
cbefe87
Add Question switch to stop the build when targets are not incremental.
yuehuang010 Sep 23, 2022
cde2e06
Add question property to tasks.
yuehuang010 Sep 23, 2022
97ef729
Add tests
yuehuang010 Sep 24, 2022
202098c
Clean up IIncrementalTask interface.
yuehuang010 Sep 29, 2022
e687090
Add additional tasks.
yuehuang010 Sep 30, 2022
96abc8a
Test and Question on this repro.
yuehuang010 Oct 4, 2022
12727c1
fix build
yuehuang010 Oct 4, 2022
878c8ef
Fix question in -m. Fix BindingRedirect to target incremental.
yuehuang010 Oct 4, 2022
f9a3730
Fix tests for Linux.
yuehuang010 Oct 5, 2022
3cdbf95
WIP
yuehuang010 Oct 18, 2022
bf65201
Fix feedbacks
yuehuang010 Oct 18, 2022
4ac5d1e
.
yuehuang010 Oct 19, 2022
36bf99d
Revert condition.
yuehuang010 Oct 19, 2022
5ec1a34
Merge branch 'main' of https://github.com/dotnet/msbuild
yuehuang010 Oct 24, 2022
2e0caf9
fix feedback.
yuehuang010 Oct 25, 2022
f172c47
touch to rerun.
yuehuang010 Oct 25, 2022
c40dce0
Merge branch 'main' of https://github.com/dotnet/msbuild
yuehuang010 Jan 19, 2023
d616c8f
Fix merge.
yuehuang010 Jan 19, 2023
bc79ec1
Fix merge pt2
yuehuang010 Jan 19, 2023
2eaf929
Merge branch 'main' into main
yuehuang010 Jan 20, 2023
c2268cc
Fix merge p3
yuehuang010 Jan 20, 2023
6ddf7a3
Fix fileState when it couldn't resolve some files.
yuehuang010 Jan 26, 2023
9d9046a
Merge branch 'main' of https://github.com/yuehuang010/msbuild
yuehuang010 Jan 26, 2023
3375f4e
Merge branch 'main' of https://github.com/dotnet/msbuild
yuehuang010 Jan 26, 2023
8edabee
Fix merge
yuehuang010 Jan 26, 2023
4c95b88
Address feedbacks
yuehuang010 Jan 26, 2023
fccbd33
Fix test.
yuehuang010 Jan 26, 2023
787d39f
Clean up.
yuehuang010 Jan 27, 2023
412817c
Merge branch 'main' of https://github.com/dotnet/msbuild
yuehuang010 Feb 2, 2023
ac1bca4
Merge branch 'main' of https://github.com/dotnet/msbuild
yuehuang010 Feb 6, 2023
bc8438f
Merge branch 'main' of https://github.com/dotnet/msbuild
yuehuang010 Feb 14, 2023
b32b17b
Merge branch 'main' of https://github.com/dotnet/msbuild
yuehuang010 Feb 28, 2023
e68be0b
Fix Feedback
yuehuang010 Feb 28, 2023
fbe74f2
Fix Feedback.
yuehuang010 Mar 1, 2023
bc99873
Update tests
yuehuang010 Mar 1, 2023
78f5bbe
Address some feedbacks.
yuehuang010 Mar 2, 2023
9327256
Update help message
yuehuang010 Mar 2, 2023
7326095
With xlf
yuehuang010 Mar 2, 2023
8299d54
update string 80 char or less.
yuehuang010 Mar 2, 2023
b23ed15
Update comments.
yuehuang010 Mar 2, 2023
2364b0b
Merge branch 'main' of https://github.com/dotnet/msbuild
yuehuang010 Apr 4, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 39 additions & 20 deletions eng/BootStrapMSBuild.targets
Original file line number Diff line number Diff line change
Expand Up @@ -119,63 +119,82 @@

<!-- Copy in props and targets from the machine-installed MSBuildExtensionsPath -->
<Copy SourceFiles="@(InstalledVersionedExtensions)"
DestinationFiles="@(InstalledVersionedExtensions->'$(BootstrapDestination)$(TargetMSBuildToolsVersion)\%(RecursiveDir)%(Filename)%(Extension)')" />
DestinationFiles="@(InstalledVersionedExtensions->'$(BootstrapDestination)$(TargetMSBuildToolsVersion)\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="true" />
<Copy SourceFiles="@(SdkResolverFiles)"
DestinationFiles="@(SdkResolverFiles->'$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin\SdkResolvers\Microsoft.DotNet.MSBuildSdkResolver\%(RecursiveDir)%(Filename)%(Extension)')" />
DestinationFiles="@(SdkResolverFiles->'$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin\SdkResolvers\Microsoft.DotNet.MSBuildSdkResolver\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="true" />

<Copy SourceFiles="@(InstalledMicrosoftExtensions)"
DestinationFiles="@(InstalledMicrosoftExtensions->'$(BootstrapDestination)Microsoft\%(RecursiveDir)%(Filename)%(Extension)')" />
DestinationFiles="@(InstalledMicrosoftExtensions->'$(BootstrapDestination)Microsoft\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="true" />

<Copy SourceFiles="@(InstalledSdks)"
DestinationFiles="@(InstalledSdks -> '$(BootstrapDestination)Sdks\%(RecursiveDir)%(Filename)%(Extension)')"
Condition="'$(MonoBuild)' != 'true'" />
Condition="'$(MonoBuild)' != 'true'"
SkipUnchangedFiles="true" />
<Copy SourceFiles="@(InstalledSdks)"
DestinationFiles="@(InstalledSdks -> '$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin\Sdks\%(RecursiveDir)%(Filename)%(Extension)')"
Condition="'$(MonoBuild)' == 'true'" />
Condition="'$(MonoBuild)' == 'true'"
SkipUnchangedFiles="true" />

<Copy SourceFiles="@(InstalledStaticAnalysisTools)"
DestinationFiles="@(InstalledStaticAnalysisTools -> '$(BootstrapDestination)..\Team Tools\Static Analysis Tools\%(RecursiveDir)%(Filename)%(Extension)')" />
DestinationFiles="@(InstalledStaticAnalysisTools -> '$(BootstrapDestination)..\Team Tools\Static Analysis Tools\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="true" />

<Copy SourceFiles="@(InstalledNuGetFiles)"
DestinationFiles="@(InstalledNuGetFiles->'$(BootstrapDestination)Microsoft\NuGet\%(Filename)%(Extension)')" />
DestinationFiles="@(InstalledNuGetFiles->'$(BootstrapDestination)Microsoft\NuGet\%(Filename)%(Extension)')"
SkipUnchangedFiles="true" />

<Copy Condition="'$(MonoBuild)' != 'true'"
SourceFiles="@(_NuGetRuntimeDependencies)"
DestinationFolder="$(BootstrapDestination)..\Common7\IDE\CommonExtensions\Microsoft\NuGet\" />
DestinationFolder="$(BootstrapDestination)..\Common7\IDE\CommonExtensions\Microsoft\NuGet\"
SkipUnchangedFiles="true" />
<Copy Condition="'$(MonoBuild)' == 'true'"
SourceFiles="@(_NuGetRuntimeDependencies)"
DestinationFolder="$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin" />
DestinationFolder="$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin"
SkipUnchangedFiles="true" />

<Copy SourceFiles="@(NuGetSdkResolverManifest)"
DestinationFolder="$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin\SdkResolvers\Microsoft.Build.NuGetSdkResolver" />
DestinationFolder="$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin\SdkResolvers\Microsoft.Build.NuGetSdkResolver"
SkipUnchangedFiles="true" />

<!-- Delete shim projects, because they point where we can't follow. -->
<!-- It would be better to just not copy these. -->
<Delete Files="@(ShimTargets->'$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin\%(FileName)%(Extension)')" />

<!-- Copy our binaries -->
<Copy SourceFiles="@(FreshlyBuiltBinaries)"
DestinationFiles="@(FreshlyBuiltBinaries -> '$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin\%(RecursiveDir)%(Filename)%(Extension)')" />
DestinationFiles="@(FreshlyBuiltBinaries -> '$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="true" />

<Copy SourceFiles="@(RoslynBinaries)"
DestinationFiles="@(RoslynBinaries -> '$(BootstrapDestination)15.0\Bin\Roslyn\%(RecursiveDir)%(Filename)%(Extension)')" />
DestinationFiles="@(RoslynBinaries -> '$(BootstrapDestination)15.0\Bin\Roslyn\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="true" />

<!-- Copy our binaries to the x64 location. -->
<Copy SourceFiles="@(FreshlyBuiltBinariesx64)"
DestinationFiles="@(FreshlyBuiltBinariesx64 -> '$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin\amd64\%(RecursiveDir)%(Filename)%(Extension)')" />
<Copy SourceFiles="@(FreshlyBuiltBinariesx64)"
DestinationFiles="@(FreshlyBuiltBinariesx64 -> '$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin\amd64\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="true" />

<!-- Copy our binaries to the arm64 location. -->
<Copy SourceFiles="@(FreshlyBuiltBinariesArm64)"
DestinationFiles="@(FreshlyBuiltBinariesArm64 -> '$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin\arm64\%(RecursiveDir)%(Filename)%(Extension)')" />
<Copy SourceFiles="@(FreshlyBuiltBinariesArm64)"
DestinationFiles="@(FreshlyBuiltBinariesArm64 -> '$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin\arm64\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="true" />

<!-- Copy our freshly-built props and targets, overwriting anything we copied from the machine -->
<Copy SourceFiles="@(FreshlyBuiltRootProjects)"
DestinationFiles="@(FreshlyBuiltRootProjects -> '$(BootstrapDestination)$(TargetMSBuildToolsVersion)\%(Filename)%(Extension)')" />
DestinationFiles="@(FreshlyBuiltRootProjects -> '$(BootstrapDestination)$(TargetMSBuildToolsVersion)\%(Filename)%(Extension)')"
SkipUnchangedFiles="true" />
<Copy SourceFiles="@(FreshlyBuiltProjects)"
DestinationFiles="@(FreshlyBuiltProjects -> '$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin\%(RecursiveDir)%(Filename)%(Extension)')" />
DestinationFiles="@(FreshlyBuiltProjects -> '$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="true" />
<Copy SourceFiles="@(FreshlyBuiltProjects)"
DestinationFiles="@(FreshlyBuiltProjects -> '$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin\amd64\%(RecursiveDir)%(Filename)%(Extension)')" />
DestinationFiles="@(FreshlyBuiltProjects -> '$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin\amd64\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="true" />
<Copy SourceFiles="@(FreshlyBuiltProjects)"
DestinationFiles="@(FreshlyBuiltProjects -> '$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin\arm64\%(RecursiveDir)%(Filename)%(Extension)')" />
DestinationFiles="@(FreshlyBuiltProjects -> '$(BootstrapDestination)$(TargetMSBuildToolsVersion)\Bin\arm64\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="true" />

</Target>

Expand Down
35 changes: 35 additions & 0 deletions src/Build.UnitTests/BackEnd/TargetBuilder_Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,41 @@ Skipping target ""Build"" because all output files are up-to-date with respect t
}
}

[Fact]
public void TestErrorForSkippedTargetInputsAndOutputs()
{
string projectContents = @"
<Project>
<Target Name=""Build"" Inputs=""a.txt;b.txt"" Outputs=""c.txt"">
<Message Text=""test"" Importance=""High"" />
</Target>
</Project>";

using (var env = TestEnvironment.Create())
{
var buildParameters = new BuildParameters()
{
Question = true,
};

using (var buildSession = new Helpers.BuildManagerSession(env, buildParameters))
{
var files = env.CreateTestProjectWithFiles(projectContents, new[] { "a.txt", "b.txt", "c.txt" });
var fileA = new FileInfo(files.CreatedFiles[0]);
var fileB = new FileInfo(files.CreatedFiles[1]);
var fileC = new FileInfo(files.CreatedFiles[2]);

var now = DateTime.UtcNow;
fileA.LastWriteTimeUtc = now - TimeSpan.FromSeconds(10);
fileB.LastWriteTimeUtc = now + TimeSpan.FromSeconds(10);
fileC.LastWriteTimeUtc = now;

var result = buildSession.BuildProjectFile(files.ProjectFile);
result.OverallResult.ShouldBe(BuildResultCode.Failure);
}
}
}

/// <summary>
/// Ensure that skipped targets only infer outputs once
/// </summary>
Expand Down
2 changes: 1 addition & 1 deletion src/Build.UnitTests/BackEnd/TargetUpToDateChecker_Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -576,7 +576,7 @@ out ItemDictionary<ProjectItemInstance> upToDateTargetInputs
ItemBucket itemBucket = new ItemBucket(null, null, new Lookup(itemsByName, new PropertyDictionary<ProjectPropertyInstance>()), 0);
TargetUpToDateChecker analyzer = new TargetUpToDateChecker(p, p.Targets["Build"], _mockHost, BuildEventContext.Invalid);

return analyzer.PerformDependencyAnalysis(itemBucket, out changedTargetInputs, out upToDateTargetInputs);
return analyzer.PerformDependencyAnalysis(itemBucket, false, out changedTargetInputs, out upToDateTargetInputs);
}
finally
{
Expand Down
1 change: 0 additions & 1 deletion src/Build.UnitTests/BackEnd/TaskBuilder_Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,6 @@ public void CanceledTasksDoNotLogMSB4181()
Loggers = new ILogger[] { logger },
EnableNodeReuse = false
};
;

BuildRequestData data = new BuildRequestData(project.CreateProjectInstance(), new string[] { "test" }, collection.HostServices);
manager.BeginBuild(_parameters);
Expand Down
13 changes: 13 additions & 0 deletions src/Build/BackEnd/BuildManager/BuildParameters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,8 @@ public class BuildParameters : ITranslatable
/// </summary>
private bool _logInitialPropertiesAndItems;

private bool _question;

/// <summary>
/// The settings used to load the project under build
/// </summary>
Expand Down Expand Up @@ -303,6 +305,7 @@ internal BuildParameters(BuildParameters other, bool resetEnvironment = false)
_outputResultsCacheFile = other._outputResultsCacheFile;
DiscardBuildResults = other.DiscardBuildResults;
LowPriority = other.LowPriority;
Question = other.Question;
ProjectCacheDescriptor = other.ProjectCacheDescriptor;
}

Expand Down Expand Up @@ -790,6 +793,15 @@ public string OutputResultsCacheFile
/// </summary>
public bool LowPriority { get; set; }

/// <summary>
/// Gets or sets a value that will error when the build process fails an incremental check.
/// </summary>
public bool Question
{
get => _question;
set => _question = value;
}

/// <summary>
/// Gets or sets the project cache description to use for all <see cref="BuildSubmission"/> or <see cref="GraphBuildSubmission"/>
/// in addition to any potential project caches described in each project.
Expand Down Expand Up @@ -854,6 +866,7 @@ void ITranslatable.Translate(ITranslator translator)
translator.TranslateEnum(ref _projectLoadSettings, (int) _projectLoadSettings);
translator.Translate(ref _interactive);
translator.Translate(ref _isolateProjects);
translator.Translate(ref _question);

// ProjectRootElementCache is not transmitted.
// ResetCaches is not transmitted.
Expand Down
9 changes: 8 additions & 1 deletion src/Build/BackEnd/Components/RequestBuilder/TargetEntry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,7 @@ internal async Task ExecuteTarget(ITaskBuilder taskBuilder, BuildRequestEntry re
// UNDONE: (Refactor) Refactor TargetUpToDateChecker to take a logging context, not a logging service.
MSBuildEventSource.Log.TargetUpToDateStart();
TargetUpToDateChecker dependencyAnalyzer = new TargetUpToDateChecker(requestEntry.RequestConfiguration.Project, _target, targetLoggingContext.LoggingService, targetLoggingContext.BuildEventContext);
DependencyAnalysisResult dependencyResult = dependencyAnalyzer.PerformDependencyAnalysis(bucket, out changedTargetInputs, out upToDateTargetInputs);
DependencyAnalysisResult dependencyResult = dependencyAnalyzer.PerformDependencyAnalysis(bucket, _host.BuildParameters.Question, out changedTargetInputs, out upToDateTargetInputs);
MSBuildEventSource.Log.TargetUpToDateStop((int)dependencyResult);

switch (dependencyResult)
Expand All @@ -472,6 +472,13 @@ internal async Task ExecuteTarget(ITaskBuilder taskBuilder, BuildRequestEntry re
case DependencyAnalysisResult.FullBuild:
case DependencyAnalysisResult.IncrementalBuild:
case DependencyAnalysisResult.SkipUpToDate:
if (dependencyResult != DependencyAnalysisResult.SkipUpToDate && _host.BuildParameters.Question && !string.IsNullOrEmpty(_target.Inputs) && !string.IsNullOrEmpty(_target.Outputs))
{
targetSuccess = false;
aggregateResult = aggregateResult.AggregateResult(new WorkUnitResult(WorkUnitResultCode.Canceled, WorkUnitActionCode.Stop, null));
break;
}

// Create the lookups used to hold the current set of properties and items
lookupForInference = bucket.Lookup;
lookupForExecution = bucket.Lookup.Clone();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ private string TargetOutputSpecification
/// incremental build is needed.
/// </remarks>
/// <param name="bucket"></param>
/// <param name="question"></param>
/// <param name="changedTargetInputs"></param>
/// <param name="upToDateTargetInputs"></param>
/// <returns>
Expand All @@ -131,6 +132,7 @@ private string TargetOutputSpecification
internal DependencyAnalysisResult PerformDependencyAnalysis
(
ItemBucket bucket,
bool question,
out ItemDictionary<ProjectItemInstance> changedTargetInputs,
out ItemDictionary<ProjectItemInstance> upToDateTargetInputs
)
Expand Down Expand Up @@ -255,7 +257,7 @@ out ItemDictionary<ProjectItemInstance> upToDateTargetInputs
}
}

LogReasonForBuildingTarget(result);
LogReasonForBuildingTarget(result, question);

return result;
}
Expand All @@ -264,15 +266,23 @@ out ItemDictionary<ProjectItemInstance> upToDateTargetInputs
/// Does appropriate logging to indicate why this target is being built fully or partially.
/// </summary>
/// <param name="result"></param>
private void LogReasonForBuildingTarget(DependencyAnalysisResult result)
/// <param name="question"></param>
private void LogReasonForBuildingTarget(DependencyAnalysisResult result, bool question)
{
// Only if we are not logging just critical events should we be logging the details
if (!_loggingService.OnlyLogCriticalEvents)
{
if (result == DependencyAnalysisResult.FullBuild && _dependencyAnalysisDetail.Count > 0)
{
// For the full build decision the are three possible outcomes
_loggingService.LogComment(_buildEventContext, MessageImportance.Low, "BuildTargetCompletely", _targetToAnalyze.Name);
if (question)
{
_loggingService.LogError(_buildEventContext, new BuildEventFileInfo(String.Empty), "BuildTargetCompletely", _targetToAnalyze.Name);
}
else
{
// For the full build decision, there are three possible outcomes
_loggingService.LogComment(_buildEventContext, MessageImportance.Low, "BuildTargetCompletely", _targetToAnalyze.Name);
}

foreach (DependencyAnalysisLogDetail logDetail in _dependencyAnalysisDetail)
{
Expand All @@ -282,8 +292,15 @@ private void LogReasonForBuildingTarget(DependencyAnalysisResult result)
}
else if (result == DependencyAnalysisResult.IncrementalBuild)
{
// For the partial build decision the are three possible outcomes
_loggingService.LogComment(_buildEventContext, MessageImportance.Normal, "BuildTargetPartially", _targetToAnalyze.Name);
if (question)
{
_loggingService.LogError(_buildEventContext, new BuildEventFileInfo(String.Empty), "BuildTargetPartially", _targetToAnalyze.Name);
}
else
{
// For the partial build decision the are three possible outcomes
_loggingService.LogComment(_buildEventContext, MessageImportance.Normal, "BuildTargetPartially", _targetToAnalyze.Name);
}
foreach (DependencyAnalysisLogDetail logDetail in _dependencyAnalysisDetail)
{
string reason = GetIncrementalBuildReason(logDetail);
Expand Down
5 changes: 5 additions & 0 deletions src/Build/BackEnd/TaskExecutionHost/TaskExecutionHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,11 @@ bool ITaskExecutionHost.SetTaskParameters(IDictionary<string, (string, ElementLo
}
}

if (this.TaskInstance is IIncrementalTask incrementalTask)
{
incrementalTask.SetQuestion(_buildComponentHost.BuildParameters.Question);
}

if (taskInitialized)
{
// See if any required properties were not set
Expand Down
2 changes: 1 addition & 1 deletion src/Directory.Build.targets
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@
</ItemGroup>
</Target>

<Target Name="CreateTypeLib" BeforeTargets="AfterBuild" Condition="'$(BuildingInsideVisualStudio)' != 'true' and '$(CreateTlb)' == 'true' and $([MSBuild]::IsOSPlatform('windows')) and '$(TargetFrameworkIdentifier)' == '.NETFramework' and '$(MSBuildRuntimeType)' != 'Core'">
<Target Name="CreateTypeLib" BeforeTargets="AfterBuild" Inputs="$(TargetPath)" Outputs="$(TargetDir)$(TargetName).tlb;$(TargetDir)x64\$(TargetName).tlb" Condition="'$(BuildingInsideVisualStudio)' != 'true' and '$(CreateTlb)' == 'true' and $([MSBuild]::IsOSPlatform('windows')) and '$(TargetFrameworkIdentifier)' == '.NETFramework' and '$(MSBuildRuntimeType)' != 'Core'">
<PropertyGroup>
<TlbExpPath>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToDotNetFrameworkSdkFile('tlbexp.exe'))</TlbExpPath>
<!-- Provide a mechanism for turning on verbose TlbExp output for diagnosing issues -->
Expand Down
15 changes: 15 additions & 0 deletions src/Framework/IIncrementalTask.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

#nullable disable

namespace Microsoft.Build.Framework
{
/// <summary>
/// Interface for tasks which is incremental
/// </summary>
public interface IIncrementalTask
{
void SetQuestion(bool question);
}
}
Loading