Fix SqlServer sibling reference handling#4259
Conversation
There was a problem hiding this comment.
Pull request overview
This PR updates how the repo’s sibling Microsoft.SqlServer.Server dependency is referenced under ReferenceType (Project vs Package), so package-mode builds/restores can resolve consistent versions and projects that require internals can explicitly enforce project-mode.
Changes:
- Switched several test/sample projects from unconditional
Microsoft.SqlServer.Serverpackage references toProjectReference/PackageReferenceconditioned on$(ReferenceType). - Added a unit-test guard to explicitly reject
ReferenceType=Package. - Updated
build.proj/Directory.Packages.propsto flowSqlServerPackageVersionin package mode and to packMicrosoft.SqlServer.Serverinto the local packages feed.
Reviewed changes
Copilot reviewed 11 out of 12 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft.Data.SqlClient.UnitTests.csproj | Adds Microsoft.SqlServer.Server project reference and rejects ReferenceType=Package. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Utf8String/Utf8String.csproj | Conditional project/package reference for Microsoft.SqlServer.Server. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Shapes/Shapes.csproj | Conditional project/package reference for Microsoft.SqlServer.Server. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Circle/Circle.csproj | Conditional project/package reference for Microsoft.SqlServer.Server (also normalizes file header). |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Address/Address.csproj | Conditional project/package reference for Microsoft.SqlServer.Server (also normalizes file header). |
| src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTests.csproj | Centralizes conditional Microsoft.SqlServer.Server reference for manual tests. |
| src/Microsoft.Data.SqlClient/ref/Microsoft.Data.SqlClient.csproj | Removes unused Microsoft.SqlServer.Server package reference from ref build project. |
| src/Microsoft.Data.SqlClient/notsupported/Microsoft.Data.SqlClient.csproj | Uses project reference for Microsoft.SqlServer.Server in project mode and package ref in package mode. |
| src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Abstractions.csproj | Formatting-only tweak to conditional reference items. |
| doc/samples/Microsoft.Data.SqlClient.Samples.csproj | Makes Microsoft.SqlServer.Server a conditional project/package reference based on ReferenceType. |
| Directory.Packages.props | Moves Microsoft.SqlServer.Server version declaration under ReferenceType=Package and uses $(SqlServerPackageVersion). |
| build.proj | Imports Versions.props to set default package versions in package mode; fixes SqlServer version forwarding; packs Microsoft.SqlServer.Server to $(PackagesDir); adds package-mode pack dependencies to build targets. |
| --> | ||
| <Target Name="BuildSqlClientNotSupported"> | ||
| <PropertyGroup> | ||
| <BuildSqlClientNotSupportedDependsOn Condition="'$(ReferenceType.ToLower())' == 'package'">PackAbstractions</BuildSqlClientNotSupportedDependsOn> |
There was a problem hiding this comment.
@benrr101 - Do we want these Build* and Pack* targets to depend on the Pack targets of the siblings this target depends on?
I think I would like this to work without any previous targets run, and use default package versions:
dotnet build -t:BuildSqlClient -p:ReferenceType=Package
There was a problem hiding this comment.
The latest commits achieve the above. Package mode now automatically ensures that the NuGet packages of sibling dependencies are built and put into packages/.
2851620 to
775fa11
Compare
f4fcba7 to
d0492fe
Compare
benrr101
left a comment
There was a problem hiding this comment.
Blocking on:
- Package/project reference going in their own item group, as per existing pattern
- Revisiting the intention of including the version props file in build.proj and confusing the recalculation of versions.
| <PackageReference Include="Microsoft.IdentityModel.JsonWebTokens" /> | ||
| <PackageReference Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" /> | ||
| <PackageReference Include="Microsoft.SqlServer.Server" /> | ||
| <PackageReference Include="Microsoft.SqlServer.Server" Condition="'$(ReferenceType)' == 'Package'" /> |
There was a problem hiding this comment.
Please follow the above pattern above - put both package and project references (like this) in one item group.
| <PackageReference Include="Microsoft.IdentityModel.JsonWebTokens" /> | ||
| <PackageReference Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" /> | ||
| <PackageReference Include="Microsoft.SqlServer.Server" /> | ||
| <PackageReference Include="Microsoft.SqlServer.Server" Condition="'$(ReferenceType)' == 'Package'" /> |
There was a problem hiding this comment.
Remove this in favor of the package/project reference in a separate item group above
| <!-- Imports ========================================================= --> | ||
| <Import Project="src/Directory.Build.props" /> | ||
|
|
||
| <!-- Import each project's Versions.props to apply default version numbers in Package mode. --> |
There was a problem hiding this comment.
I don't think this will work as well as you think it will ... The parameters passed to build.proj are PackageVersion* while the parameters passed to the csproj (and props files) are *PackageVersion. This was a compromise between wanting neat and orderly parameters in build2.proj, and not obliterating the existing csproj parameters.
There was a problem hiding this comment.
Yep, this wasn't the correct approach. Added imports to Directory.Packages.props to ensure defaults are computed early enough in the build process to be applied correctly for Package builds.
| Example: 1.0.1-dev2345 | ||
| --> | ||
| <PackageVersionAbstractions Condition="'$(PackageVersionAbstractions)' == ''" /> | ||
| <PackageVersionAbstractions Condition="'$(PackageVersionAbstractions)' == ''">$(AbstractionsPackageVersion)</PackageVersionAbstractions> |
There was a problem hiding this comment.
This more or less confound the whole versioning process I laid out...
The intention was that each project would know what its versions should be, and any projects that depend on another project just references that project and gets the sibling version. Further, the intention is that package reference goes away, so the remaining scenario where a package version is needed goes away.
Doing things this way means .... we calculate the versions with only some of the parameters provided, then call dotnet with this version, then recalculate the version with the package version provided. I think it's confusing and I'm not sure what scenario its trying to solve.
There was a problem hiding this comment.
Correct - see above reply.
| $(ReferenceTypeArgument) | ||
| $(PackageVersionAbstractionsArgument) | ||
| $(PackageVersionLoggingArgument) | ||
| $(PackageVersionSqlServerArgument) |
There was a problem hiding this comment.
This isn't being added as a parameter at the top.
There was a problem hiding this comment.
This property is computed as expected now.
d0492fe to
88d1198
Compare
88d1198 to
8200659
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 27 out of 27 changed files in this pull request and generated 1 comment.
Comments suppressed due to low confidence (1)
src/Microsoft.SqlServer.Server/Microsoft.SqlServer.Server.csproj:13
- Because this Versions.props import is now gated by $(SqlServerVersionsImported), any earlier import (e.g., via Directory.Packages.props in ReferenceType=Package builds) will prevent re-importing after src/Directory.Build.props defines FileVersionBuildNumber. If the earlier import occurs before FileVersionBuildNumber is set, SqlServerFileVersion/SqlServerAssemblyVersion can be computed incorrectly and then “locked in” for the rest of the build. To make the guard safe, ensure Versions.props can compute correct versions even when imported before Directory.Build.props (e.g., define BuildNumber/FileVersionBuildNumber defaults inside Versions.props).
<!-- Versioning ====================================================== -->
<Import Project="Versions.props" Condition="'$(SqlServerVersionsImported)' != 'true'" />
<PropertyGroup>
<AssemblyVersion>$(SqlServerAssemblyVersion)</AssemblyVersion>
<FileVersion>$(SqlServerFileVersion)</FileVersion>
<Version>$(SqlServerPackageVersion)</Version>
| <!-- Import Versions.props files when building via Package references --> | ||
| <!-- This makes version properties available early for package pinning --> | ||
| <ImportGroup Condition="'$(ReferenceType)' == 'Package'"> | ||
| <Import Project="src/Microsoft.Data.SqlClient/Versions.props" /> | ||
| <Import Project="src/Microsoft.SqlServer.Server/Versions.props" /> |
Summary
Microsoft.SqlServer.Serversibling references across affected projects to respectReferenceType(Project vs Package)SqlServerPackageVersionwiring through build orchestrationBUILDGUIDE.mdaligned with the current build/pack entrypoint guidanceMicrosoft.Data.SqlClient.csprojValidation
dotnet build src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft.Data.SqlClient.UnitTests.csproj -f net8.0 -v minimaldotnet build src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTests.csproj -f net8.0 -v minimaldotnet build build.proj -t:BuildSqlClientUnix -p:ReferenceType=Package -v minimaldotnet build src/Microsoft.Data.SqlClient.slnx -v minimaldotnet build build.proj -p:Configuration=Debug