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

Added the ability to supply baseNuspecFile to the CreatePackage task #150

Open
wants to merge 2 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 31 additions & 16 deletions src/Build/NuGet.Build.Packaging.Tasks/CreatePackage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ public class CreatePackage : Task

public string NuspecFile { get; set; }

public string BaseNuspecFile { get; set; }


[Output]
public ITaskItem OutputPackage { get; set; }

Expand All @@ -40,7 +43,7 @@ public override bool Execute()

OutputPackage = new TaskItem(TargetPath);
Manifest.CopyMetadataTo(OutputPackage);

return !Log.HasLoggedErrors;
}
catch (Exception ex)
Expand All @@ -66,6 +69,16 @@ public Manifest CreateManifest()
{
var metadata = new ManifestMetadata();

if (!string.IsNullOrEmpty(BaseNuspecFile))
{
using (var stream = File.OpenRead(BaseNuspecFile))
{
var baesManifest = NuGet.Packaging.Manifest.ReadFrom(stream, false);
metadata = baesManifest.Metadata;

}
}

metadata.Id = Manifest.GetMetadata("Id");
metadata.Version = NuGetVersion.Parse(Manifest.GetMetadata(MetadataName.Version));
metadata.DevelopmentDependency = Manifest.GetBoolean("DevelopmentDependency");
Expand Down Expand Up @@ -106,7 +119,7 @@ public Manifest CreateManifest()
void AddDependencies(Manifest manifest)
{
var dependencies = from item in Contents
where item.GetMetadata(MetadataName.Kind) == PackageItemKind.Dependency &&
where item.GetMetadata(MetadataName.Kind) == PackageItemKind.Dependency &&
!"all".Equals(item.GetMetadata(MetadataName.PrivateAssets), StringComparison.OrdinalIgnoreCase)
select new Dependency
{
Expand Down Expand Up @@ -140,12 +153,12 @@ select item.GetNuGetTargetFramework()))
definedDependencyGroups.Add(targetFramework.GetFrameworkString(),
new PackageDependencyGroup(targetFramework, Array.Empty<PackageDependency>()));

manifest.Metadata.DependencyGroups = definedDependencyGroups.Values;
manifest.Metadata.DependencyGroups = definedDependencyGroups.Values.Concat(manifest.Metadata.DependencyGroups);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

II think what would be needed is more of a merge here, than a concat, since the concat would end up with duplicate groups? Is that supported in the nuspec?

}

void AddFiles(Manifest manifest)
{
var contents = Contents.Where(item =>
var contents = Contents.Where(item =>
!string.IsNullOrEmpty(item.GetMetadata(MetadataName.PackagePath)));

var duplicates = contents.GroupBy(item => item.GetMetadata(MetadataName.PackagePath))
Expand All @@ -166,28 +179,30 @@ void AddFiles(Manifest manifest)
}));

// Additional metadata for the content files must be added separately
manifest.Metadata.ContentFiles = contents
var contentFiles = contents
.Where(item => item.GetMetadata(MetadataName.PackageFolder) == PackagingConstants.Folders.ContentFiles)
.Select(item => new ManifestContentFiles
{
Include = item.GetMetadata(MetadataName.PackagePath),
BuildAction = item.GetNullableMetadata(MetadataName.ContentFile.BuildAction),
CopyToOutput = item.GetNullableMetadata(MetadataName.ContentFile.CopyToOutput),
Flatten = item.GetNullableMetadata(MetadataName.ContentFile.Flatten),
}).ToArray();
});

manifest.Metadata.ContentFiles = contentFiles.Concat(manifest.Metadata.ContentFiles);
}

void AddFrameworkAssemblies(Manifest manifest)
{
var frameworkReferences = (from item in Contents
where item.GetMetadata(MetadataName.Kind) == PackageItemKind.FrameworkReference
select new FrameworkAssemblyReference
(
item.ItemSpec,
new[] { NuGetFramework.Parse(item.GetTargetFrameworkMoniker().FullName) }
)).Distinct(FrameworkAssemblyReferenceComparer.Default);

manifest.Metadata.FrameworkReferences = frameworkReferences;
where item.GetMetadata(MetadataName.Kind) == PackageItemKind.FrameworkReference
select new FrameworkAssemblyReference
(
item.ItemSpec,
new[] { NuGetFramework.Parse(item.GetTargetFrameworkMoniker().FullName) }
)).Distinct(FrameworkAssemblyReferenceComparer.Default);

manifest.Metadata.FrameworkReferences = frameworkReferences.Concat(manifest.Metadata.FrameworkReferences);
}

void BuildPackage(Stream output)
Expand All @@ -199,9 +214,9 @@ void BuildPackage(Stream output)
// We don't use PopulateFiles because that performs search expansion, base path
// extraction and the like, which messes with our determined files to include.
// TBD: do we support wilcard-based include/exclude?
builder.Files.AddRange(manifest.Files.Select(file =>
builder.Files.AddRange(manifest.Files.Select(file =>
new PhysicalPackageFile { SourcePath = file.Source, TargetPath = file.Target }));

builder.Save(output);

if (!string.IsNullOrEmpty(NuspecFile))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ Copyright (c) .NET Foundation. All rights reserved.

<Target Name="_GetReferencedPackageContents"
Condition="'$(_SupportsProjectReferences)' == 'true'"
DependsOnTargets="$(_GetReferencedPackageContentsDependsOn)"
DependsOnTargets="$(_GetReferencedPackageContentsDependsOn)"
Returns="@(PackageFile)">
<Error Condition="'@(_NonNuGetizedProjectReference)' != ''"
Code="NG0011"
Expand Down Expand Up @@ -374,7 +374,7 @@ Copyright (c) .NET Foundation. All rights reserved.
-->
<Target Name="Pack" DependsOnTargets="$(PackDependsOn)" Returns="@(PackageTargetPath)" Condition="'$(IsPackable)' == 'true'">
<MakeDir Directories="$(PackageOutputPath)" Condition="!Exists('$(PackageOutputPath)')" />
<CreatePackage Manifest="@(PackageTargetPath)" NuspecFile="$(NuspecFile)" Contents="@(_PackageContent)" TargetPath="@(PackageTargetPath->'%(FullPath)')">
<CreatePackage Manifest="@(PackageTargetPath)" NuspecFile="$(NuspecFile)" BaseNuspecFile="$(BaseNuspecFile)" Contents="@(_PackageContent)" TargetPath="@(PackageTargetPath->'%(FullPath)')">
<Output TaskParameter="OutputPackage" ItemName="_PackageTargetPath" />
<Output TaskParameter="OutputPackage" ItemName="FileWrites" />
</CreatePackage>
Expand Down