默认的 NuGet 包支持在 releaseNotes 中添加更改日志,用户可以通过更改日志了解各个版本更新的内容。在 SDK Style 格式的 csproj 文件,可以读取本地的文本文件的内容作为 NuGet 包的改动日志
在我的团队的 CBB 基础库项目的文件规范,要求每个项目都会包含 README.md 和 CHANGELOG.md 文件,其中的 CHANGELOG.md 文件就是记录 API 变更等的改动记录文件
在更改日志写的比较好的项目是 Office 团队的 Open-XML-SDK 项目的 CHANGELOG.md 文件 这个文件记录了每次 PR 包含的更改
在 SDK Style 里面让打包的 NuGet 添加改动日志的方法是设置 PackageReleaseNotes 属性的值,如下面代码
<PropertyGroup>
<PackageReleaseNotes># 1.0
测试</PackageReleaseNotes>
</PropertyGroup>
而在项目就包含了 CHANGELOG.md 文件
那么是否可以在 SDK Style 格式的项目文件里面读取项目的 CHANGELOG.md 或 RELEASE-NOTES.txt 的内容,作为 NuGet 包的 ReleaseNotes 内容?可以通过下面几个方法
<PropertyGroup>
<ChangeLogFile>$(MSBuildProjectDirectory)\CHANGELOG.md</ChangeLogFile>
<PackageReleaseNotes>$([System.IO.File]::ReadAllText($(ChangeLogFile)))</PackageReleaseNotes>
</PropertyGroup>
上面这个方法将会使用读取文件的方式,将 ChangeLogFile
的内容读取,然后将文本作为 PackageReleaseNotes 属性的内容。这里需要注意 ChangeLogFile 文件需要使用 Utf-8 编码
上面代码的 $(MSBuildProjectDirectory)
表示的是 csproj 项目文件所在的文件夹的路径,如果是期望获取当前的文件的文件夹,可以使用 $(MSBuildThisFileDirectory)
获取当前文件所在的文件夹。上面代码如果写在 csproj 文件,那么 $(MSBuildThisFileDirectory)
和 $(MSBuildProjectDirectory)
是相同的
另一个方法不是很靠谱,是通过 Target 读取文件的方式,这个方法不靠谱原因是 GenerateNuspec 不一定触发
<Target Name="PreparePackageReleaseNotesFromFile" BeforeTargets="GenerateNuspec">
<ReadLinesFromFile File="../RELEASE-NOTES.txt" >
<Output TaskParameter="Lines" ItemName="ReleaseNoteLines"/>
</ReadLinesFromFile>
<PropertyGroup>
<PackageReleaseNotes>@(ReleaseNoteLines, '%0a')</PackageReleaseNotes>
</PropertyGroup>
</Target>
上面代码读取 RELEASE-NOTES.txt 文件作为变更日志的内容
本文会经常更新,请阅读原文: https://dotnet-campus.github.io//post/Roslyn-%E6%89%93%E5%8C%85-NuGet-%E5%8C%85%E6%B7%BB%E5%8A%A0%E6%94%B9%E5%8A%A8%E6%97%A5%E5%BF%97.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 lindexi (包含链接: https://dotnet-campus.github.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。