Skip to content

Commit da51b8a

Browse files
kzuCopilot
andcommitted
Support central package version management
Allow SmallSharp package directives to work when ManagePackageVersionsCentrally is enabled by omitting Version metadata for centrally managed package references and warning when inline versions are present. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 88e91cf commit da51b8a

3 files changed

Lines changed: 64 additions & 17 deletions

File tree

src/SmallSharp/EmitTargets.cs

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace SmallSharp;
1414
public class EmitTargets : Task
1515
{
1616
static readonly Regex sdkExpr = new(@"^#:sdk\s+(?<sdk>[^@]+?)(@(?<version>.+))?$");
17-
static readonly Regex packageExpr = new(@"^#:package\s+(?<id>[^@]+)@(?<version>.+)$");
17+
static readonly Regex packageExpr = new(@"^#:package\s+(?<id>[^@\s]+)(@(?<version>.+))?$");
1818
static readonly Regex propertyExpr = new(@"^#:property\s+(?<name>[^=]+)=(?<value>.+)$");
1919

2020
[Required]
@@ -32,6 +32,8 @@ public class EmitTargets : Task
3232
[Required]
3333
public required bool UsingSDK { get; set; }
3434

35+
public bool ManagePackageVersionsCentrally { get; set; }
36+
3537
public ITaskItem[] PackageReferences { get; set; } = [];
3638

3739
[Output]
@@ -62,18 +64,44 @@ public override bool Execute()
6264
var properties = new List<XElement>();
6365
var sdks = new List<XAttribute[]>();
6466

65-
foreach (var line in contents)
67+
for (var i = 0; i < contents.Length; i++)
6668
{
69+
var line = contents[i];
6770
if (packageExpr.Match(line) is { Success: true } match)
6871
{
6972
var id = match.Groups["id"].Value.Trim();
7073
var version = match.Groups["version"].Value.Trim();
74+
var hasVersion = !string.IsNullOrEmpty(version);
7175

72-
packages.Add(NewTaskItem(id, [("Version", version)]));
76+
if (ManagePackageVersionsCentrally && hasVersion && !UsingSDK)
77+
{
78+
Log.LogWarning(
79+
null,
80+
"SCS05",
81+
null,
82+
filePath,
83+
i + 1,
84+
0,
85+
0,
86+
0,
87+
"Package reference '{0}' declares version '{1}' via #:package while ManagePackageVersionsCentrally=true; SmallSharp will omit Version metadata and use the central package version.",
88+
id,
89+
version);
90+
}
7391

74-
items.Add(new XElement("PackageReference",
75-
new XAttribute("Include", id),
76-
new XAttribute("Version", version)));
92+
if (!ManagePackageVersionsCentrally && hasVersion)
93+
{
94+
packages.Add(NewTaskItem(id, [("Version", version)]));
95+
items.Add(new XElement("PackageReference",
96+
new XAttribute("Include", id),
97+
new XAttribute("Version", version)));
98+
}
99+
else
100+
{
101+
packages.Add(new TaskItem(id));
102+
items.Add(new XElement("PackageReference",
103+
new XAttribute("Include", id)));
104+
}
77105
}
78106
else if (sdkExpr.Match(line) is { Success: true } sdkMatch)
79107
{
@@ -130,15 +158,16 @@ public override bool Execute()
130158
new XElement("PropertyGroup",
131159
[new XElement("SmallSharpProjectExtensionPropsImported", "true")])));
132160

133-
// Determine if a restore is needed: if any discovered #:package (id+version) is not already
161+
// Determine if a restore is needed: if any discovered #:package is not already
134162
// present in the incoming PackageReferences list.
135163
foreach (var pkg in packages)
136164
{
137165
var id = pkg.ItemSpec;
138166
var version = pkg.GetMetadata("Version");
139167
var exists = PackageReferences?.Any(r =>
140168
string.Equals(r.ItemSpec, id, StringComparison.OrdinalIgnoreCase) &&
141-
string.Equals(r.GetMetadata("Version"), version, StringComparison.OrdinalIgnoreCase)) == true;
169+
(string.IsNullOrEmpty(version) ||
170+
string.Equals(r.GetMetadata("Version"), version, StringComparison.OrdinalIgnoreCase))) == true;
142171

143172
if (!exists)
144173
{

src/SmallSharp/Sdk.targets

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,30 @@
2626
<ItemGroup Condition="'@(_PkgLines)' != ''">
2727
<_PkgReference Include="$([MSBuild]::ValueOrDefault('%(_PkgLines.Identity)', '').Substring(10))" />
2828

29-
<PackageReference Condition="'@(_PkgReference)' != ''" Include="$([MSBuild]::ValueOrDefault('%(_PkgReference.Identity)', '').Split('@')[0])">
30-
<Version>$([MSBuild]::ValueOrDefault('%(_PkgReference.Identity)', '').Split('@')[1])</Version>
29+
<_PkgReferenceWithVersion Include="@(_PkgReference)"
30+
Condition="$([System.Text.RegularExpressions.Regex]::IsMatch('%(_PkgReference.Identity)', '@'))">
31+
<PackageId>$([System.Text.RegularExpressions.Regex]::Replace('%(_PkgReference.Identity)', '@.*$', ''))</PackageId>
32+
<PackageVersion>$([System.Text.RegularExpressions.Regex]::Replace('%(_PkgReference.Identity)', '^[^@]+@', ''))</PackageVersion>
33+
</_PkgReferenceWithVersion>
34+
35+
<_PkgReferenceWithoutVersion Include="@(_PkgReference)"
36+
Condition="!$([System.Text.RegularExpressions.Regex]::IsMatch('%(_PkgReference.Identity)', '@'))" />
37+
38+
<PackageReference Include="@(_PkgReferenceWithoutVersion)" />
39+
40+
<PackageReference Include="%(_PkgReferenceWithVersion.PackageId)"
41+
Condition="'$(ManagePackageVersionsCentrally)' == 'true'" />
42+
43+
<PackageReference Include="%(_PkgReferenceWithVersion.PackageId)"
44+
Condition="'$(ManagePackageVersionsCentrally)' != 'true'">
45+
<Version>%(_PkgReferenceWithVersion.PackageVersion)</Version>
3146
</PackageReference>
3247
</ItemGroup>
3348

49+
<Warning Code="SCS05"
50+
Condition="'$(ManagePackageVersionsCentrally)' == 'true' and '@(_PkgReferenceWithVersion)' != ''"
51+
Text="Package references declared with #:package and @ versions are not compatible with ManagePackageVersionsCentrally=true; SmallSharp will omit Version metadata and use central package versions for: @(_PkgReferenceWithVersion -> '%(Identity)', ', ')." />
52+
3453
</Target>
3554

3655
</Project>

src/SmallSharp/SmallSharp.targets

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@
5151
<Target Name="EnsureProperties" Condition="'$(CheckSmallSharpRequirements)' != 'false'">
5252
<Error Code="SCS02" Condition="'$(_ImportProjectExtensionProps)' != 'true' or '$(_ImportProjectExtensionTargets)' != 'true'"
5353
Text="Setting ImportProjectExtensionProps and ImportProjectExtensionTargets project properties to 'true' is required by SmallSharp to support C# package and project directives." />
54-
<Error Code="SCS03" Condition="'$(ManagePackageVersionsCentrally)' == 'true'"
55-
Text="Setting ManagePackageVersionsCentrally to 'true' is not supported by SmallSharp since C# program files can declare package references via #:package directives." />
5654
<Warning Code="SCS04" Condition="'$(UsingSmallSharpSDK)' != 'true'"
5755
Text='For maximum compatibility with file-based apps, use SmallSharp as an SDK instead of a package reference: &lt;Project Sdk="SmallSharp/$(SmallSharpVersion)"&gt;' />
5856
</Target>
@@ -195,11 +193,12 @@
195193
Inputs="@(Compile);$(ActiveDebugProfile);$(ActiveFile);Properties\launchSettings.json"
196194
Outputs="$(SmallSharpPackagesProps);$(SmallSharpPackagesTargets)">
197195
<EmitTargets StartupFile="$(StartupFile)"
198-
UsingSDK="$(UsingSmallSharpSDK)"
199-
PackageReferences="@(PackageReferences)"
200-
PropsFile="$(SmallSharpPackagesProps)"
201-
TargetsFile="$(SmallSharpPackagesTargets)"
202-
BaseIntermediateOutputPath="$(BaseIntermediateOutputPath)">
196+
UsingSDK="$(UsingSmallSharpSDK)"
197+
ManagePackageVersionsCentrally="$([MSBuild]::ValueOrDefault('$(ManagePackageVersionsCentrally)', 'false'))"
198+
PackageReferences="@(PackageReferences)"
199+
PropsFile="$(SmallSharpPackagesProps)"
200+
TargetsFile="$(SmallSharpPackagesTargets)"
201+
BaseIntermediateOutputPath="$(BaseIntermediateOutputPath)">
203202
<Output TaskParameter="Packages" ItemName="FileBasedPackage" />
204203
<Output TaskParameter="Properties" PropertyName="FileBasedProperty" />
205204
<Output TaskParameter="Sdks" PropertyName="FileBasedSdk" />

0 commit comments

Comments
 (0)