Skip to content

Commit d4a9cc1

Browse files
author
Tibor Götz
committed
Only mark dotnet dependencies to be dev dependency instead of forcibly remove them.
1 parent aa4f23d commit d4a9cc1

11 files changed

+51
-48
lines changed

CycloneDX.Tests/ProgramTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public async Task CallingCycloneDX_CreatesOutputDirectory()
4747
});
4848
var mockSolutionFileService = new Mock<ISolutionFileService>();
4949
mockSolutionFileService
50-
.Setup(s => s.GetSolutionDotnetDependencys(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<bool>(), It.IsAny<string>(), It.IsAny<string>()))
50+
.Setup(s => s.GetSolutionDotnetDependencys(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<string>(), It.IsAny<string>()))
5151
.ReturnsAsync(new HashSet<DotnetDependency>());
5252

5353
Runner runner = new Runner(fileSystem: mockFileSystem, null, null, null, null, null, solutionFileService: mockSolutionFileService.Object, null);
@@ -72,7 +72,7 @@ public async Task CallingCycloneDX_WithOutputFilename_CreatesOutputFilename()
7272
});
7373
var mockSolutionFileService = new Mock<ISolutionFileService>();
7474
mockSolutionFileService
75-
.Setup(s => s.GetSolutionDotnetDependencys(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<bool>(), It.IsAny<string>(), It.IsAny<string>()))
75+
.Setup(s => s.GetSolutionDotnetDependencys(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<string>(), It.IsAny<string>()))
7676
.ReturnsAsync(new HashSet<DotnetDependency>());
7777

7878
Runner runner = new Runner(fileSystem: mockFileSystem, null, null, null, null, null, solutionFileService: mockSolutionFileService.Object, null);

CycloneDX.Tests/ProjectAssetsFileServiceTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ public void GetDotnetDependencys_PackageAsTopLevelAndTransitive(string framework
236236
});
237237

238238
var projectAssetsFileService = new ProjectAssetsFileService(mockFileSystem, () => mockAssetReader.Object);
239-
var packages = projectAssetsFileService.GetDotnetDependencys(XFS.Path(@"c:\SolutionPath\Project1\Project1.csproj"), XFS.Path(@"c:\SolutionPath\Project1\obj\project.assets.json"), false, false);
239+
var packages = projectAssetsFileService.GetDotnetDependencys(XFS.Path(@"c:\SolutionPath\Project1\Project1.csproj"), XFS.Path(@"c:\SolutionPath\Project1\obj\project.assets.json"), false);
240240
var sortedPackages = new List<DotnetDependency>(packages);
241241

242242
sortedPackages.Sort();
@@ -396,7 +396,7 @@ public void GetDotnetDependencys_MissingResolvedPackageVersion(string framework,
396396
});
397397

398398
var projectAssetsFileService = new ProjectAssetsFileService(mockFileSystem, () => mockAssetReader.Object);
399-
var packages = projectAssetsFileService.GetDotnetDependencys(XFS.Path(@"c:\SolutionPath\Project1\Project1.csproj"), XFS.Path(@"c:\SolutionPath\Project1\obj\project.assets.json"), false, false);
399+
var packages = projectAssetsFileService.GetDotnetDependencys(XFS.Path(@"c:\SolutionPath\Project1\Project1.csproj"), XFS.Path(@"c:\SolutionPath\Project1\obj\project.assets.json"), false);
400400
var sortedPackages = new List<DotnetDependency>(packages);
401401

402402
sortedPackages.Sort();
@@ -530,7 +530,7 @@ public void GetDotnetDependencys_MissingDependencies(string framework, int frame
530530
});
531531

532532
var projectAssetsFileService = new ProjectAssetsFileService(mockFileSystem, () => mockAssetReader.Object);
533-
var packages = projectAssetsFileService.GetDotnetDependencys(XFS.Path(@"c:\SolutionPath\Project1\Project1.csproj"), XFS.Path(@"c:\SolutionPath\Project1\obj\project.assets.json"), false, false);
533+
var packages = projectAssetsFileService.GetDotnetDependencys(XFS.Path(@"c:\SolutionPath\Project1\Project1.csproj"), XFS.Path(@"c:\SolutionPath\Project1\obj\project.assets.json"), false);
534534
var sortedPackages = new List<DotnetDependency>(packages);
535535

536536
sortedPackages.Sort();

CycloneDX.Tests/ProjectFileServiceTests.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public async Task GetProjectDotnetDependencys_WithProjectAssetsFile_ReturnsDotne
8282
var mockPackageFileService = new Mock<IPackagesFileService>();
8383
var mockProjectAssetsFileService = new Mock<IProjectAssetsFileService>();
8484
mockProjectAssetsFileService
85-
.Setup(s => s.GetDotnetDependencys(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<bool>()))
85+
.Setup(s => s.GetDotnetDependencys(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>()))
8686
.Returns(new HashSet<DotnetDependency>
8787
{
8888
new DotnetDependency { Name = "Package", Version = "1.2.3" },
@@ -93,7 +93,7 @@ public async Task GetProjectDotnetDependencys_WithProjectAssetsFile_ReturnsDotne
9393
mockPackageFileService.Object,
9494
mockProjectAssetsFileService.Object);
9595

96-
var packages = await projectFileService.GetProjectDotnetDependencysAsync(XFS.Path(@"c:\Project\Project.csproj"), "", false, false, "", "").ConfigureAwait(true);
96+
var packages = await projectFileService.GetProjectDotnetDependencysAsync(XFS.Path(@"c:\Project\Project.csproj"), "", false, "", "").ConfigureAwait(true);
9797

9898
Assert.Collection(packages,
9999
item => {
@@ -117,7 +117,7 @@ public async Task GetProjectDotnetDependencys_WithProjectAssetsFileWithoutRestor
117117
var mockPackageFileService = new Mock<IPackagesFileService>();
118118
var mockProjectAssetsFileService = new Mock<IProjectAssetsFileService>();
119119
mockProjectAssetsFileService
120-
.Setup(s => s.GetDotnetDependencys(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<bool>()))
120+
.Setup(s => s.GetDotnetDependencys(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>()))
121121
.Returns(new HashSet<DotnetDependency>
122122
{
123123
new DotnetDependency { Name = "Package", Version = "1.2.3" },
@@ -129,7 +129,7 @@ public async Task GetProjectDotnetDependencys_WithProjectAssetsFileWithoutRestor
129129
mockProjectAssetsFileService.Object);
130130
projectFileService.DisablePackageRestore = true;
131131

132-
var packages = await projectFileService.GetProjectDotnetDependencysAsync(XFS.Path(@"c:\Project\Project.csproj"), "", false, false, "", "").ConfigureAwait(true);
132+
var packages = await projectFileService.GetProjectDotnetDependencysAsync(XFS.Path(@"c:\Project\Project.csproj"), "", false, "", "").ConfigureAwait(true);
133133

134134
Assert.Collection(packages,
135135
item => {
@@ -153,7 +153,7 @@ public async Task GetProjectDotnetDependencys_WithProjectAssetsFile_ReturnsMulti
153153
var mockPackageFileService = new Mock<IPackagesFileService>();
154154
var mockProjectAssetsFileService = new Mock<IProjectAssetsFileService>();
155155
mockProjectAssetsFileService
156-
.Setup(s => s.GetDotnetDependencys(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<bool>()))
156+
.Setup(s => s.GetDotnetDependencys(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>()))
157157
.Returns(new HashSet<DotnetDependency>
158158
{
159159
new DotnetDependency { Name = "Package1", Version = "1.2.3" },
@@ -166,7 +166,7 @@ public async Task GetProjectDotnetDependencys_WithProjectAssetsFile_ReturnsMulti
166166
mockPackageFileService.Object,
167167
mockProjectAssetsFileService.Object);
168168

169-
var packages = await projectFileService.GetProjectDotnetDependencysAsync(XFS.Path(@"c:\Project\Project.csproj"), "", false, false, "", "").ConfigureAwait(true);
169+
var packages = await projectFileService.GetProjectDotnetDependencysAsync(XFS.Path(@"c:\Project\Project.csproj"), "", false, "", "").ConfigureAwait(true);
170170
var sortedPackages = new List<DotnetDependency>(packages);
171171
sortedPackages.Sort();
172172

@@ -199,15 +199,15 @@ public async Task GetProjectDotnetDependencys_WithPackagesConfig_ReturnsDotnetDe
199199
);
200200
var mockProjectAssetsFileService = new Mock<IProjectAssetsFileService>();
201201
mockProjectAssetsFileService
202-
.Setup(s => s.GetDotnetDependencys(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<bool>()))
202+
.Setup(s => s.GetDotnetDependencys(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>()))
203203
.Returns(new HashSet<DotnetDependency>());
204204
var projectFileService = new ProjectFileService(
205205
mockFileSystem,
206206
mockDotnetUtilsService.Object,
207207
mockPackageFileService.Object,
208208
mockProjectAssetsFileService.Object);
209209

210-
var packages = await projectFileService.GetProjectDotnetDependencysAsync(XFS.Path(@"c:\Project\Project.csproj"), "", false, false, "", "").ConfigureAwait(true);
210+
var packages = await projectFileService.GetProjectDotnetDependencysAsync(XFS.Path(@"c:\Project\Project.csproj"), "", false, "", "").ConfigureAwait(true);
211211

212212
Assert.Collection(packages,
213213
item => {
@@ -241,15 +241,15 @@ public async Task GetProjectDotnetDependencys_WithPackagesConfig_ReturnsMultiple
241241
);
242242
var mockProjectAssetsFileService = new Mock<IProjectAssetsFileService>();
243243
mockProjectAssetsFileService
244-
.Setup(s => s.GetDotnetDependencys(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<bool>()))
244+
.Setup(s => s.GetDotnetDependencys(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>()))
245245
.Returns(new HashSet<DotnetDependency>());
246246
var projectFileService = new ProjectFileService(
247247
mockFileSystem,
248248
mockDotnetUtilsService.Object,
249249
mockPackageFileService.Object,
250250
mockProjectAssetsFileService.Object);
251251

252-
var packages = await projectFileService.GetProjectDotnetDependencysAsync(XFS.Path(@"c:\Project\Project.csproj"), "", false, false, "", "").ConfigureAwait(true);
252+
var packages = await projectFileService.GetProjectDotnetDependencysAsync(XFS.Path(@"c:\Project\Project.csproj"), "", false, "", "").ConfigureAwait(true);
253253
var sortedPackages = new List<DotnetDependency>(packages);
254254
sortedPackages.Sort();
255255

CycloneDX.Tests/ValidationTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public async Task Validation(string fileFormat, bool disableGitHubLicenses)
3838

3939
var mockProjectFileService = new Mock<IProjectFileService>();
4040
mockProjectFileService.Setup(mock =>
41-
mock.GetProjectDotnetDependencysAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<bool>(), It.IsAny<string>(), It.IsAny<string>())
41+
mock.GetProjectDotnetDependencysAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<string>(), It.IsAny<string>())
4242
).ReturnsAsync(packages);
4343

4444
Runner runner = new Runner(fileSystem: mockFileSystem, null, null, null, null, projectFileService: mockProjectFileService.Object, solutionFileService: null, null);

CycloneDX/Interfaces/IProjectAssetsFileService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ namespace CycloneDX.Interfaces
2222
{
2323
public interface IProjectAssetsFileService
2424
{
25-
HashSet<DotnetDependency> GetDotnetDependencys(string projectFilePath, string projectAssetsFilePath, bool IsTestProject, bool excludeDevDependencies);
25+
HashSet<DotnetDependency> GetDotnetDependencys(string projectFilePath, string projectAssetsFilePath, bool IsTestProject);
2626
}
2727
}

CycloneDX/Interfaces/IProjectFileService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ namespace CycloneDX.Interfaces
2424
public interface IProjectFileService
2525
{
2626
bool DisablePackageRestore { get; set; }
27-
Task<HashSet<DotnetDependency>> GetProjectDotnetDependencysAsync(string projectFilePath, string baseIntermediateOutputPath, bool excludeTestProjects, bool excludeDevDependencies, string framework, string runtime);
27+
Task<HashSet<DotnetDependency>> GetProjectDotnetDependencysAsync(string projectFilePath, string baseIntermediateOutputPath, bool excludeTestProjects, string framework, string runtime);
2828
Task<HashSet<string>> GetProjectReferencesAsync(string projectFilePath);
29-
Task<HashSet<DotnetDependency>> RecursivelyGetProjectDotnetDependencysAsync(string projectFilePath, string baseIntermediateOutputPath, bool excludeTestProjects, bool excludeDevDependencies, string framework, string runtime);
29+
Task<HashSet<DotnetDependency>> RecursivelyGetProjectDotnetDependencysAsync(string projectFilePath, string baseIntermediateOutputPath, bool excludeTestProjects, string framework, string runtime);
3030
Task<HashSet<DotnetDependency>> RecursivelyGetProjectReferencesAsync(string projectFilePath);
3131
Component GetComponent(DotnetDependency dotnetDependency);
3232
bool IsTestProject(string projectFilePath);

CycloneDX/Interfaces/ISolutionFileService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,6 @@ namespace CycloneDX.Interfaces
2424
public interface ISolutionFileService
2525
{
2626
Task<HashSet<string>> GetSolutionProjectReferencesAsync(string solutionFilePath);
27-
Task<HashSet<DotnetDependency>> GetSolutionDotnetDependencys(string solutionFilePath, string baseIntermediateOutputPath, bool excludeTestProjects, bool excludeDevDependencies, string framework, string runtime);
27+
Task<HashSet<DotnetDependency>> GetSolutionDotnetDependencys(string solutionFilePath, string baseIntermediateOutputPath, bool excludeTestProjects, string framework, string runtime);
2828
}
2929
}

CycloneDX/Runner.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,17 +164,17 @@ public async Task<int> HandleCommandAsync(RunOptions options)
164164
{
165165
if (SolutionOrProjectFile.ToLowerInvariant().EndsWith(".sln", StringComparison.OrdinalIgnoreCase))
166166
{
167-
packages = await solutionFileService.GetSolutionDotnetDependencys(fullSolutionOrProjectFilePath, baseIntermediateOutputPath, excludetestprojects, excludeDev, framework, runtime).ConfigureAwait(false);
167+
packages = await solutionFileService.GetSolutionDotnetDependencys(fullSolutionOrProjectFilePath, baseIntermediateOutputPath, excludetestprojects, framework, runtime).ConfigureAwait(false);
168168
topLevelComponent.Name = fileSystem.Path.GetFileNameWithoutExtension(SolutionOrProjectFile);
169169
}
170170
else if (Utils.IsSupportedProjectType(SolutionOrProjectFile) && scanProjectReferences)
171171
{
172-
packages = await projectFileService.RecursivelyGetProjectDotnetDependencysAsync(fullSolutionOrProjectFilePath, baseIntermediateOutputPath, excludetestprojects, excludeDev, framework, runtime).ConfigureAwait(false);
172+
packages = await projectFileService.RecursivelyGetProjectDotnetDependencysAsync(fullSolutionOrProjectFilePath, baseIntermediateOutputPath, excludetestprojects, framework, runtime).ConfigureAwait(false);
173173
topLevelComponent.Name = fileSystem.Path.GetFileNameWithoutExtension(SolutionOrProjectFile);
174174
}
175175
else if (Utils.IsSupportedProjectType(SolutionOrProjectFile))
176176
{
177-
packages = await projectFileService.GetProjectDotnetDependencysAsync(fullSolutionOrProjectFilePath, baseIntermediateOutputPath, excludetestprojects, excludeDev, framework, runtime).ConfigureAwait(false);
177+
packages = await projectFileService.GetProjectDotnetDependencysAsync(fullSolutionOrProjectFilePath, baseIntermediateOutputPath, excludetestprojects, framework, runtime).ConfigureAwait(false);
178178
topLevelComponent.Name = fileSystem.Path.GetFileNameWithoutExtension(SolutionOrProjectFile);
179179
}
180180
else if (this.fileSystem.Path.GetFileName(SolutionOrProjectFile).ToLowerInvariant().Equals("packages.config", StringComparison.OrdinalIgnoreCase))

CycloneDX/Services/ProjectAssetsFileService.cs

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717

1818
using System;
1919
using System.Collections.Generic;
20+
using System.IO;
2021
using System.IO.Abstractions;
21-
using CycloneDX.Models;
2222
using System.Linq;
2323
using CycloneDX.Interfaces;
24-
using NuGet.Versioning;
24+
using CycloneDX.Models;
2525
using NuGet.LibraryModel;
2626
using NuGet.ProjectModel;
27-
using System.IO;
27+
using NuGet.Versioning;
2828

2929
namespace CycloneDX.Services
3030
{
@@ -39,7 +39,7 @@ public ProjectAssetsFileService(IFileSystem fileSystem, Func<IAssetFileReader> a
3939
_assetFileReaderFactory = assetFileReaderFactory;
4040
}
4141

42-
public HashSet<DotnetDependency> GetDotnetDependencys(string projectFilePath, string projectAssetsFilePath, bool isTestProject, bool excludeDevDependencies)
42+
public HashSet<DotnetDependency> GetDotnetDependencys(string projectFilePath, string projectAssetsFilePath, bool isTestProject)
4343
{
4444
var packages = new HashSet<DotnetDependency>();
4545

@@ -100,21 +100,21 @@ public HashSet<DotnetDependency> GetDotnetDependencys(string projectFilePath, st
100100
var allPackages = runtimePackages.Select(p => p.Name);
101101
var packagesNotInAllPackages = allDependencies.Except(allPackages);
102102

103-
if (excludeDevDependencies)
103+
var realRuntimePackages = new HashSet<DotnetDependency>();
104+
foreach (DotnetDependency dd in runtimePackages)
104105
{
105-
var realRuntimePackages = new HashSet<DotnetDependency>();
106-
foreach (DotnetDependency dd in runtimePackages)
106+
if (!dd.IsDirectReference)
107107
{
108-
if (!dd.IsDirectReference)
109-
{
110-
continue;
111-
}
112-
113-
ResolvedRuntimeDependencies(dd, runtimePackages, realRuntimePackages);
108+
continue;
114109
}
115-
runtimePackages = realRuntimePackages;
116-
}
117-
110+
111+
ResolvedRuntimeDependencies(dd, runtimePackages, realRuntimePackages);
112+
}
113+
foreach (DotnetDependency dd in runtimePackages.Except(realRuntimePackages))
114+
{
115+
dd.IsDevDependency = true;
116+
}
117+
118118
// Check if there is an "unresolved" dependency on NetStandard
119119
if (packagesNotInAllPackages.Any(p => p == "NETStandard.Library"))
120120
{
@@ -159,8 +159,11 @@ private static void ResolvedRuntimeDependencies(DotnetDependency dotnetDependenc
159159

160160
foreach (KeyValuePair<string,string> child in dotnetDependency.Dependencies)
161161
{
162-
DotnetDependency childDependency = allpackages.First(p => string.Equals(p.Name, child.Key, StringComparison.OrdinalIgnoreCase));
163-
ResolvedRuntimeDependencies(childDependency, allpackages, collectedDependencies);
162+
DotnetDependency childDependency = allpackages.FirstOrDefault(p => string.Equals(p.Name, child.Key, StringComparison.OrdinalIgnoreCase));
163+
if (childDependency != null)
164+
{
165+
ResolvedRuntimeDependencies(childDependency, allpackages, collectedDependencies);
166+
}
164167
}
165168
}
166169

0 commit comments

Comments
 (0)