Skip to content

Commit 0e7609c

Browse files
committed
Improve integration with CLI restore in SDK mode
In SDK mode we can just always read the package references from the startup file and therefore Restore will Just Work. In non-SDK mode we'll depend on an initial run and it's mostly for IDE usage where this problem doesn't exist because VS will detect the generated targets changed and will automatically invoke a restore while you're editing.
1 parent 0a70272 commit 0e7609c

File tree

4 files changed

+36
-6
lines changed

4 files changed

+36
-6
lines changed

src/SmallSharp/EmitTargets.cs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ public class EmitTargets : Task
2929
[Required]
3030
public required string TargetsFile { get; set; }
3131

32+
[Required]
33+
public required bool UsingSDK { get; set; }
34+
35+
public ITaskItem[] PackageReferences { get; set; } = [];
36+
3237
[Output]
3338
public ITaskItem[] Packages { get; set; } = [];
3439

@@ -38,6 +43,9 @@ public class EmitTargets : Task
3843
[Output]
3944
public ITaskItem[] Properties { get; set; } = [];
4045

46+
[Output]
47+
public bool RestoreNeeded { get; set; } = false;
48+
4149
public override bool Execute()
4250
{
4351
if (StartupFile is null)
@@ -103,7 +111,8 @@ public override bool Execute()
103111

104112
WriteXml(TargetsFile, new XElement("Project",
105113
new XElement("PropertyGroup", properties),
106-
new XElement("ItemGroup", items)
114+
// don't emit package references in SDK mode, since we'll add them from the SDK targets.
115+
UsingSDK ? new XElement("ItemGroup") : new XElement("ItemGroup", items)
107116
));
108117

109118
WriteXml(Path.Combine(BaseIntermediateOutputPath, "SmallSharp.sdk.props"), new XElement("Project",
@@ -116,6 +125,23 @@ public override bool Execute()
116125
new XElement("PropertyGroup",
117126
[new XElement("SmallSharpProjectExtensionPropsImported", "true")])));
118127

128+
// Determine if a restore is needed: if any discovered #:package (id+version) is not already
129+
// present in the incoming PackageReferences list.
130+
foreach (var pkg in packages)
131+
{
132+
var id = pkg.ItemSpec;
133+
var version = pkg.GetMetadata("Version");
134+
var exists = PackageReferences?.Any(r =>
135+
string.Equals(r.ItemSpec, id, StringComparison.OrdinalIgnoreCase) &&
136+
string.Equals(r.GetMetadata("Version"), version, StringComparison.OrdinalIgnoreCase)) == true;
137+
138+
if (!exists)
139+
{
140+
RestoreNeeded = true;
141+
break;
142+
}
143+
}
144+
119145
return true;
120146
}
121147

src/SmallSharp/Sdk.targets

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@
88

99
<Import Project="..\build\SmallSharp.targets" />
1010

11-
<Target Name="ImplicitPackageReferenceFromStartupFile" BeforeTargets="_GenerateProjectRestoreGraphPerFramework;ResolvePackageAssets"
11+
<Target Name="ImplicitPackageReferenceFromStartupFile"
12+
BeforeTargets="_GenerateProjectRestoreGraphPerFramework;ResolvePackageAssets;CompileDesignTime;CollectUpToDateCheckInputDesignTime"
1213
DependsOnTargets="StartupFile"
13-
Condition="'$(StartupFile)' != '' and Exists('$(StartupFile)') and '$(SmallSharpProjectExtensionPropsImported)' != 'true'">
14+
Condition="'$(StartupFile)' != '' and Exists('$(StartupFile)')">
1415

1516
<!-- Optimize for restore success on first run without previously running our targets -->
1617
<ReadLinesFromFile File="$(StartupFile)">

src/SmallSharp/SmallSharp.targets

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,13 +168,16 @@
168168
<Target Name="EmitTargets" DependsOnTargets="CollectStartupFile;SelectTopLevelCompile;SelectStartupFile"
169169
Inputs="@(Compile);$(ActiveDebugProfile);$(ActiveFile);Properties\launchSettings.json"
170170
Outputs="$(SmallSharpPackagesProps);$(SmallSharpPackagesTargets)">
171-
<EmitTargets StartupFile="$(StartupFile)"
171+
<EmitTargets StartupFile="$(StartupFile)"
172+
UsingSDK="$(UsingSmallSharpSDK)"
173+
PackageReferences="@(PackageReferences)"
172174
PropsFile="$(SmallSharpPackagesProps)"
173175
TargetsFile="$(SmallSharpPackagesTargets)"
174176
BaseIntermediateOutputPath="$(BaseIntermediateOutputPath)">
175177
<Output TaskParameter="Packages" ItemName="FileBasedPackage" />
176178
<Output TaskParameter="Properties" PropertyName="FileBasedProperty" />
177179
<Output TaskParameter="Sdks" PropertyName="FileBasedSdk" />
180+
<Output TaskParameter="RestoreNeeded" PropertyName="RestoreNeeded" />
178181
</EmitTargets>
179182
<Error Code="SCS001" Condition="'@(FileBasedSdk)' != '' and '$(UsingSmallSharpSDK)' != 'true'"
180183
Text="Using #:sdk directives requires using SmallSharp as an SDK instead of a package reference: &lt;Project Sdk='SmallSharp/$(SmallSharpVersion)'&gt;" />

src/demo.ps1

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ jq --arg version "$version" '.["msbuild-sdks"].SmallSharp = $version' global.jso
66

77
# build with each top-level file as the active one
88
foreach ($file in gci *.cs) {
9-
rm -r -fo obj -ea 0
10-
dotnet build Demo.csproj -p:ActiveFile=$($file.Name) -bl
9+
# rm -r -fo obj -ea 0
10+
dotnet build Demo.csproj -p:ActiveFile=$($file.Name) -bl:"$($file.BaseName).binlog"
1111
if ($LASTEXITCODE -ne 0) {
1212
Write-Error "Build failed for $($file.Name)"
1313
popd; popd;

0 commit comments

Comments
 (0)