Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
14 changes: 14 additions & 0 deletions MSBuild.SDK.SystemWeb.sln
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,17 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExampleRazorLibrary", "samp
EndProject
Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "ExampleRazorLibraryVB", "samples\RazorLibrary\ExampleRazorLibraryVB\ExampleRazorLibraryVB.vbproj", "{AD80B3C1-916E-4E46-BF07-6AEE8606AB00}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MSBuild.SDK.SystemWeb.UnitTests", "src\MSBuild.SDK.SystemWeb.UnitTests\MSBuild.SDK.SystemWeb.UnitTests.csproj", "{7EF08C1D-DA34-4914-9D8D-BCDF0E4F5723}"
EndProject
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "TestingShared", "src\TestingShared\TestingShared.shproj", "{A68AB20E-383F-4D41-BDB3-94411C643BF8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MSBuild.SDK.SystemWeb.Common", "src\MSBuild.SDK.SystemWeb.CommonFiles\MSBuild.SDK.SystemWeb.Common.csproj", "{EEEE3759-9ACC-426D-BCDB-E33838C9D024}"
EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
src\TestingShared\TestingShared.projitems*{7ef08c1d-da34-4914-9d8d-bcdf0e4f5723}*SharedItemsImports = 5
src\TestingShared\TestingShared.projitems*{a68ab20e-383f-4d41-bdb3-94411c643bf8}*SharedItemsImports = 13
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
Expand Down Expand Up @@ -100,6 +108,10 @@ Global
{AD80B3C1-916E-4E46-BF07-6AEE8606AB00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AD80B3C1-916E-4E46-BF07-6AEE8606AB00}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AD80B3C1-916E-4E46-BF07-6AEE8606AB00}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7EF08C1D-DA34-4914-9D8D-BCDF0E4F5723}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7EF08C1D-DA34-4914-9D8D-BCDF0E4F5723}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7EF08C1D-DA34-4914-9D8D-BCDF0E4F5723}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7EF08C1D-DA34-4914-9D8D-BCDF0E4F5723}.Release|Any CPU.Build.0 = Release|Any CPU
{EEEE3759-9ACC-426D-BCDB-E33838C9D024}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EEEE3759-9ACC-426D-BCDB-E33838C9D024}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EEEE3759-9ACC-426D-BCDB-E33838C9D024}.Release|Any CPU.ActiveCfg = Release|Any CPU
Expand All @@ -121,6 +133,8 @@ Global
{3BC6F60B-0AC5-4300-9DFD-4B65D97FFD12} = {26AD80FE-B7CD-457A-B03A-90A5B395759E}
{A699C2E4-43C7-409D-BC2B-1197E61FD9BC} = {26AD80FE-B7CD-457A-B03A-90A5B395759E}
{AD80B3C1-916E-4E46-BF07-6AEE8606AB00} = {26AD80FE-B7CD-457A-B03A-90A5B395759E}
{7EF08C1D-DA34-4914-9D8D-BCDF0E4F5723} = {B91408ED-7A59-4890-8CB2-5A011DD62B1C}
{A68AB20E-383F-4D41-BDB3-94411C643BF8} = {B91408ED-7A59-4890-8CB2-5A011DD62B1C}
{EEEE3759-9ACC-426D-BCDB-E33838C9D024} = {B91408ED-7A59-4890-8CB2-5A011DD62B1C}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
Expand Down
5 changes: 1 addition & 4 deletions docs/RazorLibrary.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,7 @@ For more information see
| Property | Default value | Description |
| -------- | ------------- | ----------- |
| `ExcludeSDKDefaultPackages` | false | Do not include the default packages `Microsoft.Net.Compilers.Toolset` and `Microsoft.CodeDom.Providers.DotNetCompilerPlatform` |
| `ApplySDKDefaultPackageVersions` | true* | Apply default version numbers to packages unless using a Central Package Management system |

*Version numbers are not applied if you are using `Microsoft.Build.CentralPackageVersions` version 2.1.1 or higher. Remember to include the packages in your central package versions file.

| `ApplySDKDefaultPackageVersions` | | Gets set to CPV/CPM/true automatically to control how we will attempt to apply Version metadata to small list of Applications. Can be explicitly set to 'false' to completey prevent this Sdk from setting Version metadata. Note: `Microsoft.Build.CentralPackageVersions` version 2.1.1 or Nuget CentralPackageManagement are supported|

### Specific Properties

Expand Down
4 changes: 1 addition & 3 deletions docs/SDK.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,9 @@ You can also use the [templates](Templates.md) to easily create new projects.
| Property | Default value | Description |
| -------- | ------------- | ----------- |
| `ExcludeSDKDefaultPackages` | false | Do not include the default packages `Microsoft.Net.Compilers.Toolset` and `Microsoft.CodeDom.Providers.DotNetCompilerPlatform` |
| `ApplySDKDefaultPackageVersions` | true* | Apply default version numbers to packages unless using a Central Package Management system |
| `ApplySDKDefaultPackageVersions` | | Gets set to CPV/CPM/true automatically to control how we will attempt to apply Version metadata to small list of Applications. Can be explicitly set to 'false' to completey prevent this Sdk from setting Version metadata. Note: `Microsoft.Build.CentralPackageVersions` version 2.1.1 or Nuget CentralPackageManagement are supported|
| `GeneratedBindingRedirectsAction` | None | Set the desired default behavior of what to do with SuggestedBindingRedirects if not yet set.<br>See [automatically generated binding redirects](Binding_Redirects/Autogenerating-Binding-Redirects.md)<br><ul><li>`None` - Do nothing except show the warning</li><li>`Preview` - Creates new Web.BindingRedirects.config file showing proposed changes</li><li>`Overwrite` - Updates the $(AppConfig) aka web.config in the project root</li></ul> |

*Version numbers are not applied if you are using `Microsoft.Build.CentralPackageVersions` version 2.1.1 or higher. Remember to include the packages in your central package versions file.

### Specific Properties

| Property | Default value | Description |
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
<!--
*************************************************************************************************************************
MSBuild.SDK.SystemWeb.Common.DefaultPackageVersions.targets
Allowing project owners to apply Central Control of Package Versions, and this Sdk is capable of providing reasonable default version numbers
when not set by the project owner
* Do this After the "ProjectFile" so we can detect if the project has already explicitly included these packages
* Do this After the "Directory.Build.targets" so CentralPackageVersions->Sdk.targets/Packages.props have already acted
* Which means AFTER the entire import chain
Microsoft.NET.Sdk/Sdk/Sdk.props
*************************************************************************************************************************
-->
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<!-- Set to CPM if using Nuget 6.2.0+ CPM
See https://learn.microsoft.com/en-us/nuget/consume-packages/Central-Package-Management
Addresses #49 -->
<ApplySDKDefaultPackageVersions Condition="'$(ManagePackageVersionsCentrally)'=='true' AND '$(ApplySDKDefaultPackageVersions)' == '' ">CPM</ApplySDKDefaultPackageVersions>

<!-- Set to CPV if using Microsoft.Build.CentralPackageVersions Requires Version 2.1.1 or higher
See https://github.com/microsoft/MSBuildSdks/tree/main/src/CentralPackageVersions -->
<ApplySDKDefaultPackageVersions Condition="'$(UsingMicrosoftCentralPackageVersionsSdk)'=='true' AND '$(EnableCentralPackageVersions)' != 'false' AND '$(ApplySDKDefaultPackageVersions)' == ''">CPV</ApplySDKDefaultPackageVersions>

<!-- Set to true if not using known Centralized logic and not already set -->
<ApplySDKDefaultPackageVersions Condition="'$(ApplySDKDefaultPackageVersions)'==''">true</ApplySDKDefaultPackageVersions>
</PropertyGroup>

<!--
*************************************************************************************************************************
Provide the appropriate mechanism to set Version for our PackageReference items when using Centralized Control
- https://github.com/CZEMacLeod/MSBuild.SDK.SystemWeb/issues/46
- https://github.com/CZEMacLeod/MSBuild.SDK.SystemWeb/issues/49
Only do this When Configured '$(ExcludeSDKDefaultPackages)'=='false' and '$(ApplySDKDefaultPackageVersions )' != 'false'
* Use a PackageVersion Item "Include" style manipulation like those found in a Directory.Packages.props
* Use a PackageReference Item "Update" style manipulation like those found in a Packages.targets
* Use a PackageReference Item "Update" style manipulation when no central logic
*************************************************************************************************************************
-->
<ItemGroup Condition="'$(ExcludeSDKDefaultPackages)'=='false' AND '$(ApplySDKDefaultPackageVersions)' != 'false'">

<!-- Find any PackageReferences added by this SDK, and provide Version when using Central Package Management -->
<PackageVersion
Include="@(PackageReference->WithMetadataValue('SystemWebSdkIncludedPackage','true')->HasMetadata('SystemWebSdkIncludedPackageVersion'))"
Exclude="@(PackageVersion)"
Condition=" '$(ApplySDKDefaultPackageVersions)' == 'CPM' "
>
<SystemWebSdkProvidedDefaultVersion>true</SystemWebSdkProvidedDefaultVersion>
<Version>%(SystemWebSdkIncludedPackageVersion)</Version>
</PackageVersion>

<!-- Find any PackageReferences added by this SDK, and provide Version when using Central Package Versions -->
<PackageReference
Update="@(PackageReference->WithMetadataValue('SystemWebSdkIncludedPackage','true')->HasMetadata('SystemWebSdkIncludedPackageVersion'))"
Condition=" '$(ApplySDKDefaultPackageVersions)' == 'CPV' "
>
<SystemWebSdkProvidedDefaultVersion Condition="'%(Version)' == '' ">true</SystemWebSdkProvidedDefaultVersion>
<Version Condition="'%(Version)' == '' ">%(SystemWebSdkIncludedPackageVersion)</Version>
</PackageReference>

<!-- Find any PackageReferences added by this SDK, and provide Version when not using any Centralized -->
<PackageReference
Update="@(PackageReference->WithMetadataValue('SystemWebSdkIncludedPackage','true')->HasMetadata('SystemWebSdkIncludedPackageVersion'))"
Condition=" '$(ApplySDKDefaultPackageVersions)' == 'true' ">
<Version Condition="'%(Version)' == '' ">%(SystemWebSdkIncludedPackageVersion)</Version>
</PackageReference>




<!-- Collect those items that this SDK has had to set so we can share some warnings later -->
<SystemWebSdkProvidedPackageVersionDefault
Include="@(PackageReference->HasMetadata('SystemWebSdkProvidedDefaultVersion')->WithMetadataValue('SystemWebSdkProvidedDefaultVersion','true'))"
Condition=" '$(ApplySDKDefaultPackageVersions)' == 'CPV' "
>
<Suggestion>&lt;PackageReference Update="%(Identity)" Version="%(Version)" /&gt;</Suggestion>
</SystemWebSdkProvidedPackageVersionDefault>
<SystemWebSdkProvidedPackageVersionDefault
Include="@(PackageVersion->HasMetadata('SystemWebSdkProvidedDefaultVersion')->WithMetadataValue('SystemWebSdkProvidedDefaultVersion','true'))"
Condition=" '$(ApplySDKDefaultPackageVersions)' == 'CPM' " >
<Suggestion>&lt;PackageVersion Include="%(Identity)" Version="%(Version)" /&gt;</Suggestion>
</SystemWebSdkProvidedPackageVersionDefault>

</ItemGroup>




<!--
*************************************************************************************************************************
Target SystemWebSdkProvidedPackageVersionDefaultWarning
* Emit Warnings (not errors) whenever
- a system of central management for package versions is detected
- AND
- an SDK applied default version for the Package Reference was provided
*************************************************************************************************************************
-->
<PropertyGroup>
<SystemWebSdkProvidedPackageVersionDefaultWarningBeforeTargets>
$(SystemWebSdkProvidedPackageVersionDefaultWarningBeforeTargets);
ResolvePackageAssets
</SystemWebSdkProvidedPackageVersionDefaultWarningBeforeTargets>

<SystemWebSdkProvidedPackageVersionDefaultWarningBeforeTargets Condition=" '$(ApplySDKDefaultPackageVersions)' == 'CPV' ">
$(SystemWebSdkProvidedPackageVersionDefaultWarningBeforeTargets);
CheckPackageReferences
</SystemWebSdkProvidedPackageVersionDefaultWarningBeforeTargets>
</PropertyGroup>

<Target Name="SystemWebSdkProvidedPackageVersionDefaultWarning" BeforeTargets="$(SystemWebSdkProvidedPackageVersionDefaultWarningBeforeTargets)"
Condition=" '$(ExcludeSDKDefaultPackages)'=='false' AND '$(ApplySDKDefaultPackageVersions)' != 'false' AND @(SystemWebSdkProvidedPackageVersionDefault->Count()) != 0 ">
<PropertyGroup>
<SystemWebSdkProvidedPackageVersionDefault_LinkedFile Condition=" '$(ApplySDKDefaultPackageVersions)' == 'CPM' AND '$(ImportDirectoryPackagesProps)' == 'true' and '$(DirectoryPackagesPropsPath)' != '' and Exists('$(DirectoryPackagesPropsPath)') ">$(DirectoryPackagesPropsPath)</SystemWebSdkProvidedPackageVersionDefault_LinkedFile>
<SystemWebSdkProvidedPackageVersionDefault_LinkedFile Condition=" '$(ApplySDKDefaultPackageVersions)' == 'CPV' AND '$(CentralPackagesFile)' != '' and Exists('$(CentralPackagesFile)') ">$(CentralPackagesFile)</SystemWebSdkProvidedPackageVersionDefault_LinkedFile>
<SystemWebSdkProvidedPackageVersionDefault_LinkedFile Condition=" '$(SystemWebSdkProvidedPackageVersionDefault_LinkedFile)' == '' ">$(MSBuildProjectFullPath)</SystemWebSdkProvidedPackageVersionDefault_LinkedFile>
</PropertyGroup>
<Warning
Text="The PackageReference '%(SystemWebSdkProvidedPackageVersionDefault.Identity)' was included by the SystemWeb Sdk defaulting to Version='%(SystemWebSdkProvidedPackageVersionDefault.Version)'. Centralized management of package versions was detected, consider adding this entry '%(SystemWebSdkProvidedPackageVersionDefault.Suggestion)' to your centralized package version listing."
File="$(SystemWebSdkProvidedPackageVersionDefault_LinkedFile)"
/>
</Target>




</Project>
Original file line number Diff line number Diff line change
@@ -1,26 +1,37 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- If we are using a central package management system such as Microsoft.Build.CentralPackageVersions do not include package versions -->
<PropertyGroup>
<!-- Requires Microsoft.Build.CentralPackageVersions Version 2.1.1 or higher
See https://github.com/microsoft/MSBuildSdks/tree/main/src/CentralPackageVersions -->
<ApplySDKDefaultPackageVersions Condition="'$(UsingMicrosoftCentralPackageVersionsSdk)'=='true'">false</ApplySDKDefaultPackageVersions>
<!-- Turn of if using Nuget 6.2.0+ CPM
See https://learn.microsoft.com/en-us/nuget/consume-packages/Central-Package-Management
Addresses #49 -->
<ApplySDKDefaultPackageVersions Condition="'$(ManagePackageVersionsCentrally)'=='true'">false</ApplySDKDefaultPackageVersions>
<ApplySDKDefaultPackageVersions Condition="'$(ApplySDKDefaultPackageVersions)'==''">true</ApplySDKDefaultPackageVersions>
</PropertyGroup>
<!--
*************************************************************************************************************************
MSBuild.SDK.SystemWeb.CommonFiles.DefaultPackages.targets
Ensure that the desirable PackageReference items are present if configured to do so
* Do this After the "ProjectFile" so we can detect if the project has already explicitly included these packages
* Do this Before the "Directory.Build.targets" so CentralPackageVersions can act on these packages
* Which means before the entire import chain
Microsoft.NET.Sdk/Sdk/Sdk.props
-> Microsoft.CSharp.targets
-> Microsoft.CSharp.CurrentVersion.targets
-> Microsoft.Common.targets
-> Directory.Build.targets
*************************************************************************************************************************
-->
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<!-- Include compilers unless ExcludeSDKDefaultPackages property is set -->
<ItemGroup Condition="'$(ExcludeSDKDefaultPackages)'=='false'">
<PackageReference Include="Microsoft.Net.Compilers.Toolset" PrivateAssets="All" GeneratePathProperty="true"/>
<PackageReference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" />
</ItemGroup>
<ItemGroup Condition=" '$(ExcludeSDKDefaultPackages)'=='false' ">
<PackageReference Include="Microsoft.Net.Compilers.Toolset"
Condition="'$(MicrosoftNetCompilersToolset_Version)'!=''"
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think these shouldn't have the condition of the version on them, as they may not have versions set if using CPM/CPV.

Would it be better to create a new item group, e.g. SDKDefaultPackageReference with these, then at the end of common do a

<PackageReference Include="@(SDKDefaultPackageReference)" 
                  Exclude="@(PackageReference)" 
                  Condition="'$(ExcludeSDKDefaultPackages)'=='false'">
  <Version /><!-- Make sure we don't apply version's here -->
  <SystemWebSdkIncludedPackage>true</SystemWebSdkIncludedPackage>
  <SystemWebSdkIncludedPackageVersion>%(Version)</SystemWebSdkIncludedPackageVersion>
</PackageReference>

or is that adding complexity that it doesn't need? (Would need to import common at the end of razor/sdk defaultpackages instead of the start.)

I just think that having simple to manage lines for the default package refs (and any custom properties such as PrivateAssets, or GeneratePathProperty) would make it simpler to read and maintain - e.g. if adding a new reference.

<ItemGroup>
    <SDKDefaultPackageReference Include="Microsoft.Net.Compilers.Toolset"
                                Version="$(MicrosoftNetCompilersToolset_Version)"
                                PrivateAssets="All"
                                GeneratePathProperty="true" />
    <SDKDefaultPackageReference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform"
                                Version="$(MicrosoftCodeDomProvidersDotNetCompilerPlatform_Version)" />
</ItemGroup>

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Conditional check on named version property

That Conditional on the version property is a holdover from back before your recent updates.

Previously it looked like this

  <ItemGroup Condition="'$(ExcludeASPNetCompilers)'=='false' AND '$(UsingMicrosoftCentralPackageVersionsSdk)'!='true'">
    <PackageReference Include="Microsoft.Net.Compilers.Toolset" Version="$(MicrosoftNetCompilersToolset_Version)" PrivateAssets="All" Condition="'$(MicrosoftNetCompilersToolset_Version)'!=''"/>
    <PackageReference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" Version="$(MicrosoftCodeDomProvidersDotNetCompilerPlatform_Version)" Condition="'$(MicrosoftCodeDomProvidersDotNetCompilerPlatform_Version)'!=''" />
  </ItemGroup>

I had assumed that it was an intentional way of allowing project owners to exclude an individual package (clear out property for single named package), so I had included that old conditional in this rendition. But we can probably go with ExcludeSDKDefaultPackages as the sole decision point.

Separate ItemGroup

I had thought about having some itemgroup that is the list of packages we will work on, but we already have named properties for each package and that is a fairly straight forward way for project owners to tweak if they want to.

In general, I think whatever these end up being, they still needs to be "incorporated" in 2 phases though

  1. Ensure that the items are added to PackageReference item group (without adding duplicates)... so after projectfile, but before Directory.Build.targets
  2. Ensure appropriate Version metadata is in place... this could be PackageReference or PackageVersion depending on which mechanism is at work... so after Directory.Build.targets

I'll think on it some more

Exclude="@(PackageReference)" >
<SystemWebSdkIncludedPackage>true</SystemWebSdkIncludedPackage>
<SystemWebSdkIncludedPackageVersion>$(MicrosoftNetCompilersToolset_Version)</SystemWebSdkIncludedPackageVersion>
<PrivateAssets>All</PrivateAssets>
<GeneratePathProperty>true</GeneratePathProperty>
</PackageReference>

<PackageReference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform"
Condition="'$(MicrosoftCodeDomProvidersDotNetCompilerPlatform_Version)'!=''"
Exclude="@(PackageReference)" >
<SystemWebSdkIncludedPackage>true</SystemWebSdkIncludedPackage>
<SystemWebSdkIncludedPackageVersion>$(MicrosoftCodeDomProvidersDotNetCompilerPlatform_Version)</SystemWebSdkIncludedPackageVersion>
</PackageReference>

<!-- Set package versions if ApplySDKDefaultPackageVersions is true -->
<ItemGroup Condition="'$(ExcludeSDKDefaultPackages)'=='false' AND '$(ApplySDKDefaultPackageVersions)'=='true'">
<PackageReference Update="Microsoft.Net.Compilers.Toolset" Version="$(MicrosoftNetCompilersToolset_Version)" Condition="'$(MicrosoftNetCompilersToolset_Version)'!=''"/>
<PackageReference Update="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" Version="$(MicrosoftCodeDomProvidersDotNetCompilerPlatform_Version)" Condition="'$(MicrosoftCodeDomProvidersDotNetCompilerPlatform_Version)'!=''" />
</ItemGroup>

</Project>
Loading