Skip to content

Commit 2ca0a47

Browse files
committed
Merge branch 'fix-missing-sdk-error' into main
2 parents d19610f + 09bdc66 commit 2ca0a47

File tree

4 files changed

+55
-9
lines changed

4 files changed

+55
-9
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
44

55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
## [Unreleased][Unreleased]
8+
9+
* Fixed a bug where `nugraph` could fail with `InvalidProjectFileException` if run from a directory containing a `Directory.Build.props` file.
10+
711
## [0.5.0][0.5.0] - 2025-06-27
812

913
* Links to nuget.org are now added only for packages which are actually available on the NuGet Gallery. Previously, a non-working link to nuget.org would be added for packages coming from private NuGet feeds.

src/nugraph/DotnetSdk.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,12 @@ public static class DotnetSdk
3131
public static IReadOnlyCollection<NuGetFramework> GetSupportedTargetFrameworks()
3232
{
3333
using var xmlReader = new XElement("Project", new XAttribute("Sdk", "Microsoft.NET.Sdk")).CreateReader();
34-
var project = new Project(xmlReader);
34+
var globalProperties = new Dictionary<string, string>
35+
{
36+
["ImportDirectoryBuildProps"] = "false",
37+
["ImportDirectoryBuildTargets"] = "false",
38+
};
39+
var project = new Project(xmlReader, globalProperties, toolsVersion: null);
3540

3641
var supportedTargetFrameworks = project.Items
3742
.Where(e => e.ItemType == "SupportedTargetFramework")

src/nugraph/TemporaryProject.cs

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,30 +12,43 @@
1212
using NuGet.Frameworks;
1313
using NuGet.Packaging.Core;
1414
using NuGet.Protocol.Core.Types;
15+
using NuGet.Versioning;
1516
using static NuGet.Frameworks.FrameworkConstants.CommonFrameworks;
1617

1718
namespace nugraph;
1819

19-
internal sealed class TemporaryProject : IDisposable
20+
public sealed class TemporaryProject : IDisposable
2021
{
2122
private static readonly Encoding Utf8NoBom = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false);
2223

2324
private readonly DirectoryInfo _directory;
2425

25-
private TemporaryProject(PackageIdentity package, NuGetFramework targetFramework)
26+
public TemporaryProject() : this(package: null, targetFramework: null)
27+
{
28+
}
29+
30+
private TemporaryProject(PackageIdentity? package, NuGetFramework? targetFramework)
2631
{
2732
_directory = new DirectoryInfo(Path.Combine(Path.GetTempPath(), "nugraph", Path.GetRandomFileName().Replace(".", "", StringComparison.OrdinalIgnoreCase)));
2833
_directory.Create();
2934

30-
var project = new XElement("Project", new XAttribute("Sdk", "Microsoft.NET.Sdk"),
31-
new XElement("PropertyGroup",
32-
new XElement("TargetFramework", targetFramework.GetShortFolderName())),
33-
new XElement("ItemGroup",
35+
var project = new XElement("Project", new XAttribute("Sdk", "Microsoft.NET.Sdk"));
36+
37+
if (targetFramework != null)
38+
{
39+
project.Add(new XElement("PropertyGroup",
40+
new XElement("TargetFramework", targetFramework.GetShortFolderName())));
41+
}
42+
43+
if (package != null)
44+
{
45+
project.Add(new XElement("ItemGroup",
3446
new XElement("PackageReference", new XAttribute("Include", package.Id), new XAttribute("Version", package.Version?.ToString() ?? "*"))));
47+
}
3548

3649
File = new FileInfo(Path.Combine(_directory.FullName, "project.csproj"));
37-
Package = package;
38-
TargetFramework = targetFramework;
50+
Package = package ?? new PackageIdentity("", new NuGetVersion(0, 0, 0));
51+
TargetFramework = targetFramework ?? NuGetFramework.UnsupportedFramework;
3952

4053
var settings = new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true, Encoding = Utf8NoBom };
4154
using var xmlWriter = XmlWriter.Create(File.FullName, settings);
@@ -44,6 +57,8 @@ private TemporaryProject(PackageIdentity package, NuGetFramework targetFramework
4457

4558
public static async Task<TemporaryProject> CreateAsync(PackageIdentity package, NuGetFramework? targetFramework, DirectoryInfo? sdk, ISettings nugetSettings, ILogger logger, CancellationToken cancellationToken)
4659
{
60+
ArgumentNullException.ThrowIfNull(logger, nameof(logger));
61+
4762
var (identity, resolvedTargetFramework) = await ResolveAsync(package, targetFramework, sdk, nugetSettings, logger, cancellationToken);
4863
return new TemporaryProject(identity, resolvedTargetFramework);
4964
}

tests/nugraph.Tests/NugraphTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,28 @@ public async Task Package_Serilog()
5656
""");
5757
}
5858

59+
[Test]
60+
public async Task Package_Serilog_WorkingDirectoryUsingArcadeSdk()
61+
{
62+
using var project = new TemporaryProject();
63+
var workingDirectory = project.File.Directory!.FullName;
64+
// lang=xml
65+
const string directoryBuildProps =
66+
"""
67+
<Project>
68+
<Import Project="Sdk.props" Sdk="Microsoft.DotNet.Arcade.Sdk" />
69+
</Project>
70+
""";
71+
await File.WriteAllTextAsync(Path.Combine(workingDirectory, "Directory.Build.props"), directoryBuildProps);
72+
73+
var result = await nugraph.RunAsync(["Serilog"], workingDirectory: workingDirectory);
74+
75+
result.Should().Match(stdOutPattern:"https://mermaid.live/view#pako:*", stdErrPattern: """
76+
Generating dependency graph for Serilog
77+
Generating dependency graph for Serilog *
78+
""");
79+
}
80+
5981
[Test]
6082
public async Task Package_Serilog_430_net60()
6183
{

0 commit comments

Comments
 (0)