Skip to content
This repository was archived by the owner on Jan 12, 2024. It is now read-only.

Commit b003e43

Browse files
williamb1024kzu
authored andcommitted
Generate empty dependency groups for target frameworks with libraries but no defined dependencies. (#137)
* Create test to ensure empty dependency groups are created for framework targets used in library files. * Added code to create empty dependency groups when a file targets a framework and the framework has no defined dependencies.
1 parent a7740c7 commit b003e43

2 files changed

Lines changed: 68 additions & 16 deletions

File tree

src/Build/NuGet.Build.Packaging.Tasks/CreatePackage.cs

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -114,22 +114,33 @@ where item.GetMetadata(MetadataName.Kind) == PackageItemKind.Dependency &&
114114
Version = VersionRange.Parse(item.GetMetadata(MetadataName.Version)),
115115
TargetFramework = item.GetNuGetTargetFramework()
116116
};
117-
118-
manifest.Metadata.DependencyGroups = (from dependency in dependencies
119-
group dependency by dependency.TargetFramework into dependenciesByFramework
120-
select new PackageDependencyGroup
121-
(
122-
dependenciesByFramework.Key,
123-
(from dependency in dependenciesByFramework
124-
where dependency.Id != "_._"
125-
group dependency by dependency.Id into dependenciesById
126-
select new PackageDependency
127-
(
128-
dependenciesById.Key,
129-
dependenciesById.Select(x => x.Version)
130-
.Aggregate(AggregateVersions)
131-
)).ToList()
132-
)).ToList();
117+
118+
var definedDependencyGroups = (from dependency in dependencies
119+
group dependency by dependency.TargetFramework into dependenciesByFramework
120+
select new PackageDependencyGroup
121+
(
122+
dependenciesByFramework.Key,
123+
(from dependency in dependenciesByFramework
124+
where dependency.Id != "_._"
125+
group dependency by dependency.Id into dependenciesById
126+
select new PackageDependency
127+
(
128+
dependenciesById.Key,
129+
dependenciesById.Select(x => x.Version)
130+
.Aggregate(AggregateVersions)
131+
)).ToList()
132+
)).ToDictionary(p => p.TargetFramework.GetFrameworkString());
133+
134+
// include frameworks referenced by libraries, but without dependencies..
135+
foreach (var targetFramework in (from item in Contents
136+
where item.GetMetadata(MetadataName.Kind) == PackageItemKind.Lib &&
137+
!"all".Equals(item.GetMetadata(MetadataName.PrivateAssets), StringComparison.OrdinalIgnoreCase)
138+
select item.GetNuGetTargetFramework()))
139+
if (!definedDependencyGroups.ContainsKey(targetFramework.GetFrameworkString()))
140+
definedDependencyGroups.Add(targetFramework.GetFrameworkString(),
141+
new PackageDependencyGroup(targetFramework, Array.Empty<PackageDependency>()));
142+
143+
manifest.Metadata.DependencyGroups = definedDependencyGroups.Values;
133144
}
134145

135146
void AddFiles(Manifest manifest)

src/Build/NuGet.Build.Packaging.Tests/CreatePackageTests.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,47 @@ public void when_creating_package_with_empty_dependency_groups_then_succeeds()
283283
Assert.All(manifest.Metadata.DependencyGroups, d => Assert.Empty(d.Packages));
284284
}
285285

286+
[Fact]
287+
public void when_creating_package_with_multiple_target_frameworks_generates_empty_dependency_groups()
288+
{
289+
task.Contents = new[]
290+
{
291+
new TaskItem(Path.GetTempFileName(), new Metadata
292+
{
293+
{ MetadataName.PackageId, task.Manifest.GetMetadata("Id") },
294+
{ MetadataName.PackagePath, "lib\\net35\\library.dll" },
295+
{ MetadataName.Kind, PackageItemKind.Lib },
296+
{ MetadataName.TargetFramework, "net35" }
297+
}),
298+
new TaskItem(Path.GetTempFileName(), new Metadata
299+
{
300+
{ MetadataName.PackageId, task.Manifest.GetMetadata("Id") },
301+
{ MetadataName.PackagePath, "lib\\net40\\library.dll" },
302+
{ MetadataName.Kind, PackageItemKind.Lib },
303+
{ MetadataName.TargetFramework, "net40" }
304+
}),
305+
new TaskItem(Path.GetTempFileName(), new Metadata
306+
{
307+
{ MetadataName.PackageId, task.Manifest.GetMetadata("Id") },
308+
{ MetadataName.PackagePath, "lib\\net45\\library.dll" },
309+
{ MetadataName.Kind, PackageItemKind.Lib },
310+
{ MetadataName.TargetFramework, "net45" }
311+
})
312+
};
313+
314+
var manifest = ExecuteTask();
315+
316+
HashSet<string> requiredFrameworks = new HashSet<string>()
317+
{
318+
"net35",
319+
"net40",
320+
"net45"
321+
};
322+
323+
Assert.NotNull(manifest);
324+
Assert.Equal(3, manifest.Metadata.DependencyGroups.Count());
325+
}
326+
286327
[Fact]
287328
public void when_creating_package_with_development_dependency_then_does_not_generate_dependency_group()
288329
{

0 commit comments

Comments
 (0)