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;
}
여러분들은 저처럼 애쓰지 말라는 의미로 기록을 남깁니다. ^^
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]