Nuke.Cola
Loading...
Searching...
No Matches
IPublishNugets.cs
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Threading.Tasks;
5using Nuke.Common;
6using Nuke.Common.IO;
7using Nuke.Common.ProjectModel;
8using Nuke.Common.Tooling;
9using Nuke.Common.Tools.DotNet;
10using Nuke.Common.Tools.GitVersion;
11
12namespace Nuke.Cola;
13
14public record ProjectRecord(Project Project, bool PublishToNuget);
15public record NugetSource(string Source, string ApiKey)
16{
17 public static IEnumerable<NugetSource> CombineFrom(string[] sources, string[] apiKeys)
18 {
19 for (int i = 0; i < sources.Length; i++)
20 {
21 yield return new(sources[i], apiKeys[i % apiKeys.Length]);
22 }
23 }
24}
25
26/// <summary>
27/// Boilerplate for publishing a dotnet project for Nuget
28/// </summary>
29public interface IPublishNugets : INukeBuild
30{
31 string VersionForNuget { get; }
32 ProjectRecord[] PublishProjects { get; }
33 NugetSource[] NugetSources { get; }
34
35 Target PublishNuget => _ => _
36 .Executes(() =>
37 {
38 Assert.NotNull(VersionForNuget);
39
40 foreach (var (project, publish) in PublishProjects)
41 {
42 var msBuildProject = project.GetMSBuildProject();
43 msBuildProject.SetProperty("Version", VersionForNuget);
44 msBuildProject.Save();
45
46 var outDirectory = project.Directory / ".nupkg";
47
48 DotNetTasks.DotNetPack(_ => _
49 .SetProject(project)
50 .SetOutputDirectory(outDirectory)
51 .EnableIncludeSymbols()
52 );
53
54 var packageId = project.GetProperty("PackageId");
55 var nupkgSymbols = outDirectory / $"{packageId}.{VersionForNuget}.symbols.nupkg";
56
57 var nupkg = nupkgSymbols.FileExists()
58 ? nupkgSymbols
59 : outDirectory / $"{packageId}.{VersionForNuget}.nupkg";
60
61 foreach (var (source, apiKey) in NugetSources)
62 {
63 DotNetTasks.DotNetNuGetPush(s => s
64 .SetTargetPath(nupkg)
65 .SetApiKey(apiKey)
66 .SetSource(source)
67 );
68 }
69 }
70 });
71}
Boilerplate for publishing a dotnet project for Nuget.