Skip to content
Merged
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
39 changes: 39 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: CI

on:
push:
branches: [ main ]
pull_request:
branches: [ main ]

env:
DOTNET_NOLOGO: 1

jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
name: Install Current .NET SDK
- name: Restore dependencies
run: dotnet restore /p:TreatWarningsAsErrors=true
- name: Build
run: dotnet build --configuration Release --no-restore /p:TreatWarningsAsErrors=true

nupkg:
name: Package
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
name: Install Current .NET SDK
- name: Generate NuGet Packages
run: dotnet pack --configuration Release --output nupkg /p:TreatWarningsAsErrors=true
- uses: actions/upload-artifact@v4
if: success() && github.ref == 'refs/heads/main'
with:
name: nupkg
path: nupkg/*
retention-days: 1
45 changes: 45 additions & 0 deletions Polyadic.Build.SemanticVersioning/GenerateSemanticVersionRanges.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
using Microsoft.Build.Framework;
using NuGet.Versioning;

namespace Polyadic.Build.SemanticVersioning;

public sealed class GenerateSemanticVersionRanges : Microsoft.Build.Utilities.Task
{
[Required]
public ITaskItem[] ProjectReferencesWithVersions { get; set; } = null!;

public string VersionMetadataName { get; set; } = "ProjectVersion";

[Output]
public ITaskItem[] ProjectReferencesWithExactVersions { get; set; } = null!;

public override bool Execute()
{
foreach (var projectReference in ProjectReferencesWithVersions)
{
var versionString = projectReference.GetMetadata(VersionMetadataName);

if (!SemanticVersion.TryParse(versionString, out var version))
{
Log.LogError("'{0}' is not a valid semantic version", versionString);
return false;
}

projectReference.SetMetadata(VersionMetadataName, ToVersionRange(version));
}

ProjectReferencesWithExactVersions = ProjectReferencesWithVersions;
return true;
}

private static string ToVersionRange(SemanticVersion version)
=> version switch
{
/* No SemVer guarantees for pre-release (e.g. nightly) versions, so we use an exact version. */
{ IsPrerelease: true } => $"[{version}]",
/* We use Cargo's convention for 0.x versions i.e. minor = breaking, patch = feature or patch. */
{ Major: 0, Minor: var minor, Patch: var patch } => $"[0.{minor}.{patch}, 0.{minor + 1})",
/* 1.x versions follow regular SemVer rules. */
{ Major: var major, Minor: var minor, Patch: var patch } => $"[{major}.{minor}.{patch}, {major + 1})",
};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>13.0</LangVersion>
</PropertyGroup>
<PropertyGroup Label="NuGet Metadata">
<Version>1.0.0</Version>
<Description>Uses semantic version ranges for ProjectReferences.</Description>
<PackageReadmeFile>readme.md</PackageReadmeFile>
</PropertyGroup>
<!-- Packaging of this MSBuild Task follows the excellent tutorial at:
<https://learn.microsoft.com/en-us/visualstudio/msbuild/tutorial-custom-task-code-generation> -->
<PropertyGroup Label="Packing">
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<GenerateDependencyFile>true</GenerateDependencyFile>
<TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
<BuildOutputTargetFolder>tasks</BuildOutputTargetFolder>
<SuppressDependenciesWhenPacking>true</SuppressDependenciesWhenPacking>
<NoWarn>$(NoWarn);NU5100</NoWarn>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="17.12.6" PrivateAssets="all" ExcludeAssets="Runtime"/>
<PackageReference Include="NuGet.Versioning" Version="6.12.1" PrivateAssets="all"/>
</ItemGroup>
<ItemGroup>
<Content Include="readme.md" PackagePath="\"/>
<Content Include="buildMultiTargeting\$(PackageId).props" PackagePath="buildMultiTargeting\"/>
<Content Include="buildMultiTargeting\$(PackageId).targets" PackagePath="buildMultiTargeting\"/>
</ItemGroup>
<Target
Name="CopyProjectReferencesToPackage"
DependsOnTargets="ResolveReferences">
<ItemGroup>
<BuildOutputInPackage
Include="@(ReferenceCopyLocalPaths)"
TargetPath="%(ReferenceCopyLocalPaths.DestinationSubPath)"/>
</ItemGroup>
</Target>
<Target
Name="AddBuildDependencyFileToBuiltProjectOutputGroupOutput"
BeforeTargets="BuiltProjectOutputGroup"
Condition="'$(GenerateDependencyFile)' == 'true'">
<ItemGroup>
<BuiltProjectOutputGroupOutput
Include="$(ProjectDepsFilePath)"
TargetPath="$(ProjectDepsFileName)"
FinalOutputPath="$(ProjectDepsFilePath)"/>
</ItemGroup>
</Target>
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="$(MSBuildThisFileName).GenerateSemanticVersionRanges"
AssemblyFile="$(MSBuildThisFileDirectory)..\tasks\netstandard2.0\$(MSBuildThisFileName).dll"/>
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- This workaround is based on comments in: https://github.com/NuGet/Home/issues/5556#issuecomment-753526765 -->
<Target Name="_PolyadicExactProjectReferencesVersion" AfterTargets="_GetProjectReferenceVersions">
<GenerateSemanticVersionRanges ProjectReferencesWithVersions="@(_ProjectReferencesWithVersions)">
<Output ItemName="_ProjectReferencesWithExactVersions" TaskParameter="ProjectReferencesWithExactVersions" />
</GenerateSemanticVersionRanges>
<ItemGroup>
<_ProjectReferencesWithVersions Remove="@(_ProjectReferencesWithVersions)" />
<_ProjectReferencesWithVersions Include="@(_ProjectReferencesWithExactVersions)" />
</ItemGroup>
</Target>
</Project>
8 changes: 8 additions & 0 deletions Polyadic.Build.SemanticVersioning/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Polyadic.Build.SemanticVersioning

> [!CAUTION]
> This package is meant for consumption by Polyadic repositories.
> As such, we may break it at any time.

Generates semantic version ranges (e.g. `[1.2.0, 2)`) for project
references during `dotnet pack`.
22 changes: 22 additions & 0 deletions Polyadic.Build.sln
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,22 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Polyadic.Build.SemanticVersioning", "Polyadic.Build.SemanticVersioning\Polyadic.Build.SemanticVersioning.csproj", "{394028FA-7997-45A2-B4E7-87852BAE577E}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build Config", "Build Config", "{84545C75-8BA9-4802-AAE1-C45F0CD258C0}"
ProjectSection(SolutionItems) = preProject
global.json = global.json
Directory.Build.props = Directory.Build.props
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{64E40113-89F8-49B0-B33E-4A99902944E1}"
ProjectSection(SolutionItems) = preProject
readme.md = readme.md
.gitignore = .gitignore
.gitattributes = .gitattributes
.editorconfig = .editorconfig
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -11,4 +27,10 @@ Global
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{394028FA-7997-45A2-B4E7-87852BAE577E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{394028FA-7997-45A2-B4E7-87852BAE577E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{394028FA-7997-45A2-B4E7-87852BAE577E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{394028FA-7997-45A2-B4E7-87852BAE577E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
5 changes: 5 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

Shared Build Tools for all Polyadic/Funcky projects.

## Packages

* **Polyadic.Build.SemanticVersioning**: Generates semantic version ranges for project references. \
[![NuGet Version](https://img.shields.io/nuget/v/Polyadic.Build.SemanticVersioning)](https://www.nuget.org/packages/Polyadic.Build.SemanticVersioning)

## License
Licensed under either of

Expand Down