diff --git a/src/StaticWebAssetsSdk/Targets/Microsoft.NET.Sdk.StaticWebAssets.Publish.targets b/src/StaticWebAssetsSdk/Targets/Microsoft.NET.Sdk.StaticWebAssets.Publish.targets
index f5d5181b2ebb..0b392f857100 100644
--- a/src/StaticWebAssetsSdk/Targets/Microsoft.NET.Sdk.StaticWebAssets.Publish.targets
+++ b/src/StaticWebAssetsSdk/Targets/Microsoft.NET.Sdk.StaticWebAssets.Publish.targets
@@ -200,6 +200,7 @@ Copyright (c) .NET Foundation. All rights reserved.
<_PublishStaticWebAssetsCopyAlways Include="@(_PublishStaticWebAssetsTargetPath)" Condition="'%(CopyToPublishDirectory)' == 'Always'" />
<_PublishStaticWebAssetsPreserveNewest Include="@(_PublishStaticWebAssetsTargetPath)" Condition="'%(CopyToPublishDirectory)' == 'PreserveNewest'" />
+ <_PublishStaticWebAssetsIfDifferent Include="@(_PublishStaticWebAssetsTargetPath)" Condition="'%(CopyToPublishDirectory)' == 'IfDifferent'" />
@@ -207,7 +208,8 @@ Copyright (c) .NET Foundation. All rights reserved.
+ AfterTargets="_SplitPublishStaticWebAssetsByCopyOptions"
+ Condition=" '@(_PublishStaticWebAssetsPreserveNewest)' != '' ">
+ AfterTargets="_SplitPublishStaticWebAssetsByCopyOptions"
+ Condition=" '@(_PublishStaticWebAssetsCopyAlways)' != '' ">
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/StaticWebAssetsSdk/Targets/Microsoft.NET.Sdk.StaticWebAssets.targets b/src/StaticWebAssetsSdk/Targets/Microsoft.NET.Sdk.StaticWebAssets.targets
index 0fb3afa2fbc2..c3e5fad9ab49 100644
--- a/src/StaticWebAssetsSdk/Targets/Microsoft.NET.Sdk.StaticWebAssets.targets
+++ b/src/StaticWebAssetsSdk/Targets/Microsoft.NET.Sdk.StaticWebAssets.targets
@@ -498,6 +498,7 @@ Copyright (c) .NET Foundation. All rights reserved.
<_BuildStaticWebAssetsCopyAlways Include="@(_BuildStaticWebAssetsTargetPath)" Condition="'%(CopyToOutputDirectory)' == 'Always'" />
<_BuildStaticWebAssetsPreserveNewest Include="@(_BuildStaticWebAssetsTargetPath)" Condition="'%(CopyToOutputDirectory)' == 'PreserveNewest'" />
+ <_BuildStaticWebAssetsIfDifferent Include="@(_BuildStaticWebAssetsTargetPath)" Condition="'%(CopyToOutputDirectory)' == 'IfDifferent'" />
@@ -537,8 +538,29 @@ Copyright (c) .NET Foundation. All rights reserved.
+
+
+
+
+
+
+
+
+
+
+
-
+
<_UpToDateCheckStaticWebAssetCandidate Include="@(StaticWebAsset)" Condition="'%(SourceType)' == 'Discovered'" />
diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets
index 728f17b43132..487dc196fb04 100644
--- a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets
+++ b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets
@@ -268,6 +268,7 @@ Copyright (c) .NET Foundation. All rights reserved.
DependsOnTargets="_IncrementalCleanPublishDirectory;
_CopyResolvedFilesToPublishPreserveNewest;
_CopyResolvedFilesToPublishAlways;
+ _CopyResolvedFilesToPublishIfDifferent;
_HandleFileConflictsForPublish" />
+
+
+
+
+
+
+
+
+
@@ -431,7 +459,7 @@ Copyright (c) .NET Foundation. All rights reserved.
============================================================
_ComputeResolvedFilesToPublishTypes
- Splits ResolvedFileToPublish items into 'PreserveNewest' and 'Always' buckets.
+ Splits ResolvedFileToPublish items into 'PreserveNewest', 'Always' and 'IfDifferent' buckets.
Then further splits those into 'Unbundled' buckets based on the single file setting.
============================================================
-->
@@ -443,6 +471,9 @@ Copyright (c) .NET Foundation. All rights reserved.
<_ResolvedFileToPublishAlways Include="@(ResolvedFileToPublish)"
Condition="'%(ResolvedFileToPublish.CopyToPublishDirectory)'=='Always'" />
+
+ <_ResolvedFileToPublishIfDifferent Include="@(ResolvedFileToPublish)"
+ Condition="'%(ResolvedFileToPublish.CopyToPublishDirectory)'=='IfDifferent'" />
@@ -456,6 +487,11 @@ Copyright (c) .NET Foundation. All rights reserved.
Include="@(_ResolvedFileToPublishAlways)"
Condition="'$(PublishSingleFile)' != 'true' or
'%(_ResolvedFileToPublishAlways.ExcludeFromSingleFile)'=='true'" />
+
+ <_ResolvedUnbundledFileToPublishIfDifferent
+ Include="@(_ResolvedFileToPublishIfDifferent)"
+ Condition="'$(PublishSingleFile)' != 'true' or
+ '%(_ResolvedFileToPublishIfDifferent.ExcludeFromSingleFile)'=='true'" />
@@ -784,6 +820,12 @@ Copyright (c) .NET Foundation. All rights reserved.
PreserveNewest
True
+
+
+ %(_SourceItemsToCopyToPublishDirectoryIfDifferent.TargetPath)
+ IfDifferent
+ True
+
@@ -845,6 +887,10 @@ Copyright (c) .NET Foundation. All rights reserved.
KeepMetadata="$(_GCTPDIKeepMetadata)"
Include="@(_AllChildProjectPublishItemsWithTargetPath->'%(FullPath)')"
Condition="'%(_AllChildProjectPublishItemsWithTargetPath.CopyToPublishDirectory)'=='PreserveNewest'"/>
+ <_SourceItemsToCopyToPublishDirectoryIfDifferent KeepDuplicates=" '$(_GCTPDIKeepDuplicates)' != 'false' "
+ KeepMetadata="$(_GCTPDIKeepMetadata)"
+ Include="@(_AllChildProjectPublishItemsWithTargetPath->'%(FullPath)')"
+ Condition="'%(_AllChildProjectPublishItemsWithTargetPath.CopyToPublishDirectory)'=='IfDifferent'"/>
@@ -860,6 +906,9 @@ Copyright (c) .NET Foundation. All rights reserved.
<_SourceItemsToCopyToPublishDirectory KeepMetadata="$(_GCTPDIKeepMetadata)"
Include="@(ContentWithTargetPath->'%(FullPath)')"
Condition="'%(ContentWithTargetPath.CopyToPublishDirectory)'=='PreserveNewest'"/>
+ <_SourceItemsToCopyToPublishDirectoryIfDifferent KeepMetadata="$(_GCTPDIKeepMetadata)"
+ Include="@(ContentWithTargetPath->'%(FullPath)')"
+ Condition="'%(ContentWithTargetPath.CopyToPublishDirectory)'=='IfDifferent'"/>
@@ -869,11 +918,14 @@ Copyright (c) .NET Foundation. All rights reserved.
<_SourceItemsToCopyToPublishDirectory KeepMetadata="$(_GCTPDIKeepMetadata)"
Include="@(EmbeddedResource->'%(FullPath)')"
Condition="'%(EmbeddedResource.CopyToPublishDirectory)'=='PreserveNewest'"/>
+ <_SourceItemsToCopyToPublishDirectoryIfDifferent KeepMetadata="$(_GCTPDIKeepMetadata)"
+ Include="@(EmbeddedResource->'%(FullPath)')"
+ Condition="'%(EmbeddedResource.CopyToPublishDirectory)'=='IfDifferent'"/>
<_CompileItemsToPublish Include="@(Compile->'%(FullPath)')"
- Condition="'%(Compile.CopyToPublishDirectory)'=='Always' or '%(Compile.CopyToPublishDirectory)'=='PreserveNewest'"/>
+ Condition="'%(Compile.CopyToPublishDirectory)'=='Always' or '%(Compile.CopyToPublishDirectory)'=='PreserveNewest'" or '%(Compile.CopyToPublishDirectory)'=='IfDifferent'"/>
@@ -887,6 +939,9 @@ Copyright (c) .NET Foundation. All rights reserved.
<_SourceItemsToCopyToPublishDirectory KeepMetadata="$(_GCTPDIKeepMetadata)"
Include="@(_CompileItemsToPublishWithTargetPath)"
Condition="'%(_CompileItemsToPublishWithTargetPath.CopyToPublishDirectory)'=='PreserveNewest'"/>
+ <_SourceItemsToCopyToPublishDirectoryIfDifferent KeepMetadata="$(_GCTPDIKeepMetadata)"
+ Include="@(_CompileItemsToPublishWithTargetPath)"
+ Condition="'%(_CompileItemsToPublishWithTargetPath.CopyToPublishDirectory)'=='IfDifferent'"/>
@@ -896,12 +951,16 @@ Copyright (c) .NET Foundation. All rights reserved.
<_SourceItemsToCopyToPublishDirectory KeepMetadata="$(_GCTPDIKeepMetadata)"
Include="@(_NoneWithTargetPath->'%(FullPath)')"
Condition="'%(_NoneWithTargetPath.CopyToPublishDirectory)'=='PreserveNewest'"/>
+ <_SourceItemsToCopyToPublishDirectoryIfDifferent KeepMetadata="$(_GCTPDIKeepMetadata)"
+ Include="@(_NoneWithTargetPath->'%(FullPath)')"
+ Condition="'%(_NoneWithTargetPath.CopyToPublishDirectory)'=='IfDifferent'"/>
<_SourceItemsToCopyToPublishDirectoryAlways Remove="$(AppHostIntermediatePath)" />
<_SourceItemsToCopyToPublishDirectory Remove="$(AppHostIntermediatePath)" />
+ <_SourceItemsToCopyToPublishDirectoryIfDifferent Remove="$(AppHostIntermediatePath)" />
<_SourceItemsToCopyToPublishDirectoryAlways Include="$(SingleFileHostIntermediatePath)" CopyToOutputDirectory="Always" TargetPath="$(AssemblyName)$(_NativeExecutableExtension)" />
@@ -911,13 +970,14 @@ Copyright (c) .NET Foundation. All rights reserved.
<_SourceItemsToCopyToPublishDirectoryAlways Remove="$(AppHostIntermediatePath)" />
<_SourceItemsToCopyToPublishDirectory Remove="$(AppHostIntermediatePath)" />
+ <_SourceItemsToCopyToPublishDirectoryIfDifferent Remove="$(AppHostIntermediatePath)" />
<_SourceItemsToCopyToPublishDirectoryAlways Include="$(AppHostForPublishIntermediatePath)" CopyToOutputDirectory="Always" TargetPath="$(AssemblyName)$(_NativeExecutableExtension)" />
-
+
@@ -927,7 +987,7 @@ Copyright (c) .NET Foundation. All rights reserved.
DefaultCopyToPublishDirectoryMetadata
If CopyToPublishDirectory isn't set on these items, the value should be taken from CopyToOutputDirectory.
- This way, projects can just set "CopyToOutputDirectory = Always/PreserveNewest" and by default the item will be copied
+ This way, projects can just set "CopyToOutputDirectory = Always/PreserveNewest/IfDifferent" and by default the item will be copied
to both the build output and publish directories.
============================================================
-->
@@ -942,6 +1002,9 @@ Copyright (c) .NET Foundation. All rights reserved.
PreserveNewest
+
+ IfDifferent
+
Always
@@ -949,6 +1012,9 @@ Copyright (c) .NET Foundation. All rights reserved.
PreserveNewest
+
+ IfDifferent
+
Always
@@ -956,6 +1022,9 @@ Copyright (c) .NET Foundation. All rights reserved.
PreserveNewest
+
+ IfDifferent
+
<_NoneWithTargetPath Condition="'%(_NoneWithTargetPath.CopyToOutputDirectory)'=='Always' and '%(_NoneWithTargetPath.CopyToPublishDirectory)' == ''">
Always
@@ -963,6 +1032,9 @@ Copyright (c) .NET Foundation. All rights reserved.
<_NoneWithTargetPath Condition="'%(_NoneWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest' and '%(_NoneWithTargetPath.CopyToPublishDirectory)' == ''">
PreserveNewest
+ <_NoneWithTargetPath Condition="'%(_NoneWithTargetPath.CopyToOutputDirectory)'=='IfDifferent' and '%(_NoneWithTargetPath.CopyToPublishDirectory)' == ''">
+ IfDifferent
+