NuGet - nuspec의 패키지 스키마 버전(네임스페이스) 업데이트 방법
지난 글에서,
C# - Source Generator를 적용한 XmlCodeGenerator
; https://www.sysnet.pe.kr/2/0/12228
만든 XmlSrcGenerator를 위한 nuspec은 대충 다음과 같은 식입니다.
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
  <metadata>
    <id>XmlSrcGenerator</id>
    <version>1.0.4</version>
    <title>C# Source Generator with XML + XSLT</title>
    <authors>SeongTae Jeong</authors>
    <owners>SeongTae Jeong</owners>
    <developmentDependency>true</developmentDependency>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <license type="expression">MIT</license>
    <licenseUrl>https://licenses.nuget.org/MIT</licenseUrl>
    <projectUrl>https://github.com/stjeong/XmlCodeGenerator</projectUrl>
    <description>C# Source Generator with XML + XSLT (same as https://marketplace.visualstudio.com/items?itemName=SeongTaeJeong.XmlCodeGenerator)</description>
    <tags>Analyzers CSharp xml xslt</tags>
  </metadata>
</package>
그런데, 여기서 package 노드의 xmlns를 다음과 같이 업데이트해봤는데요,
<package xmlns="http://schemas.microsoft.com/packaging/2011/10/nuspec.xsd">
이상하게 "nuget pack"을 한 후 생성된 nupkg의 압축을 해제해서 확인해 보면 다시 "
http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"로 돌아가 있는 것을 확인할 수 있습니다. 혹시 업데이트 방법이 없을까요? ^^
그래서 찾아봤더니 다음의 글이 나옵니다.
How to specify Nuget schema?
; https://stackoverflow.com/questions/33225461/how-to-specify-nuget-schema
그러니까, 저 스키마 버전은 nuget.exe가 내부적으로 자동 지정한다는 것입니다. 그러면서 소스 코드 링크를 걸어주었는데, 실제로 다음과 같은 규칙을 확인할 수 있습니다.
// PackageBuilder
// https://github.com/NuGet/NuGet2/blob/2.8.7/src/Core/Authoring/PackageBuilder.cs#L284-L299
private static int DetermineMinimumSchemaVersion(Collection<IPackageFile> Files)
{
    if (HasXdtTransformFile(Files))
    {
        // version 5
        return ManifestVersionUtility.XdtTransformationVersion;
    }
    if (RequiresV4TargetFrameworkSchema(Files))
    {
        // version 4
        return ManifestVersionUtility.TargetFrameworkSupportForDependencyContentsAndToolsVersion;
    }
    return ManifestVersionUtility.DefaultVersion;
}
// ManifestSchemaUtility
// https://github.com/NuGet/NuGet2/blob/2.8.7/src/Core/Authoring/ManifestVersionUtility.cs#L25-L52
private static int GetMaxVersionFromMetadata(ManifestMetadata metadata)
{
    // Important: check for version 5 before version 4
    bool referencesHasTargetFramework =
        metadata.ReferenceSets != null &&
        metadata.ReferenceSets.Any(r => r.TargetFramework != null);
    if (referencesHasTargetFramework)
    {
        return TargetFrameworkSupportForReferencesVersion;
    }
    bool dependencyHasTargetFramework =
        metadata.DependencySets != null &&
        metadata.DependencySets.Any(d => d.TargetFramework != null);
    if (dependencyHasTargetFramework)
    {
        return TargetFrameworkSupportForDependencyContentsAndToolsVersion;
    }
    SemanticVersion semanticVersion;
    if (SemanticVersion.TryParse(metadata.Version, out semanticVersion) && !String.IsNullOrEmpty(semanticVersion.SpecialVersion))
    {
        return SemverVersion;
    }
    return DefaultVersion;
}
여러분들은 저처럼 애쓰지 말라는 의미로 기록을 남깁니다. ^^
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]