自动创建 NuGet 包





5.00/5 (6投票s)
快速、稳定、强大的 NuGet 包创建
引言
本文将介绍一个简单、快速、自动化且功能齐全的开源解决方案,用于创建 NuGet 包。
背景
创建 NuGet 包有许多方法,例如:
- 手动创建 NuSpec XML 文件,然后使用 NuGet.exe 创建 NuPkg 文件
- 使用 NuGet Package Explorer
- 安装 Visual Studio 的插件
- 使用自定义 TFS 模板
我创建 NuGet 包的目标是:
- 在 TFS 构建期间自动创建包
- 在本地构建期间自动创建包
- 快速创建包,以便本地构建不会耗时太长
- 同步程序集版本号与包版本号
- 启用为包自动分配预发行版本号
- 支持从解决方案中打包多个程序集
- 启用自动列出外部(NuGet 包)依赖项
- 支持对同一解决方案中(同一构建期间)构建的内部 NuGet 包的依赖项
- 启用在包中包含源代码以便于单步调试
- 在每次构建时自动刷新源代码文件列表
- 不崩溃
然而,现有的选项都无法满足这些目标。
Using the Code
- 创建版本号的来源
在解决方案中添加一个名为 VersionInfo.cs(或其他名称)的共享文件,并在其中包含以下属性:AssemblyCompany
,在此下方填写你的公司名称或作者的名称AssemblyTrademark
,在此下方填写项目 URL(确保许可证也在此 URL 下)。AssemblyFileVersion
,在此下方填写程序集和 NuGet 包的版本号,例如 1.2.3.0。将第四个数字保留为0
,因为它将被忽略。AssemblyInformationalVersion
,在此下方填写上述版本号 + -sometext(如果包是预发行包),例如 1.2.3-alpha 或 1.2.3-pre-release。
using System.Reflection; [assembly: AssemblyCompany("Your company name")] [assembly: AssemblyTrademark("https://your.project.url/")] [assembly: AssemblyFileVersion("1.2.3.0")] #if DEBUG [assembly: AssemblyInformationalVersion("1.2.3-alpha")] #else [assembly: AssemblyInformationalVersion("1.2.3")] #endif
- 同步项目之间的版本号
Alt+拖动 VersionInfo.cs 文件到你希望包含在包中的所有程序集。 (Alt+拖动会在新位置创建文件的链接,而不是复制它。) - 从 AssemblyInfo.cs 文件中移除
AssemblyCompany
、AssemblyTrademark
、AssemblyFileVersion
和AssemblyInformationalVersion
属性,以防止重复属性(这会导致构建失败)。 - 使用标准的“添加”对话框(是的,是标准的类库模板!)在解决方案中添加一个新的项目用于你的 NuGet 包。命名为
YourNuGetPackageName.NuGet
(.NuGet
是可选的)。 - 为新项目重复步骤 2+3(添加 VersionInfo.cs 的链接,从 AssemblyInfo.cs 中移除重复项)。
- 从新的 NuGet 项目添加引用到你希望包含在包中的同一解决方案内的任何程序集。
- 为该包应依赖的任何外部 NuGet 包,向新的 NuGet 项目添加 NuGet 包。
- 内部 NuGet 依赖项:如果你的包依赖于在同一解决方案中创建的其他 NuGet 包
- 向新的 NuGet 项目添加一个名为 internalPackages.config 的文本文件(你可以复制 packages.config 并重命名它)。
- 编辑 internalPackages.config 文件,使其结构与 packages.config 文件相同,但是列出用解决方案创建的 NuGet 包,例如:
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="PubComp.NoSql.Core" version="2.0.0" targetFramework="net45" /> </packages>
- 在 AssemblyInfo.cs 中的
AssemblyTitle
属性中列出你希望为你的包设置的任何标签。 - 在 AssemblyInfo.cs 中的
AssemblyDescription
属性中为你的包添加描述。 - 在 AssemblyInfo.cs 中的
AssemblyProduct
属性中设置包的名称。[assembly: AssemblyTitle("NoSQL, Repository, Abstraction, Design Patterns, MongoDb")] [assembly: AssemblyDescription ("A MongoDb-based implementation of the NoSQL abstraction layer")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyProduct("PubComp.NoSql.MongoDb")] [assembly: AssemblyCopyright("Copyright © 2014")] [assembly: AssemblyCulture("")]
- 将 NuGet.exe 和 NuGetPack.exe 添加到你的解决方案文件夹 + 添加解决方案本身(以便 TFS 构建可以使用它们)。
- NuGet.exe 是你已经拥有的标准 NuGet.exe 文件。
- NuGetPack.exe 可在 https://pubcomp.codeplex.com/ 处获取源代码和二进制文件。
- 可选:或者,你可以通过向包项目添加一个名为 NuGetPack.config 的文件来设置标签、描述、摘要、作者、所有者、版权、图标 URL、项目 URL 和包生成选项。
<NuGetPack> <AddFrameworkReferences>true</AddFrameworkReferences> <DoIncludeSources>true</DoIncludeSources> <IconUrl>https://nuget.net.cn/favicon.ico</IconUrl> <ProjectUrl>https://pubcomp.codeplex.com/</ProjectUrl> <LicenseUrl>https://pubcomp.codeplex.com/license</LicenseUrl> <Authors>Demo Author</Authors> <Owners>Demo Owner</Owners> <Copyright>Demo Copyright</Copyright> <Description>Demo Description</Description> <Summary>Demo Summary</Summary> <Keywords>Demo, Key, Word</Keywords> </NuGetPack>
- 如果你使用“添加框架引用”选项,请移除包项目中不需要的框架引用。
- 可选:你可以在包项目的一个名为 content 的文件夹下包含
内容
。
可以通过按住 ALT 键拖动文件,或者在使用“添加现有项”菜单选项时,使用“添加”按钮上的“添加为链接”下拉选项,将内容文件添加为链接,而不是原始文件的副本。 - 可选:你可以在包项目的一个名为 lib 的文件夹下包含(非 NuGet)
二进制文件
。要包含特定 .NET Framework 版本的二进制文件,请将它们放在子文件夹下,例如 lib\net20、lib\net40 等。
与内容文件一样,这些文件可以添加为链接或原始文件的副本。 - 可选:你可以通过将项目添加到包项目的一个名为 sln 的文件夹下,来包含要保留在包文件夹中但未添加到任何项目中的项。
与内容文件一样,这些文件可以添加为链接或原始文件的副本。 - 你的包依赖的 .NET Framework 版本由包项目的框架版本决定。要更改它,请通过项目属性更改包项目的“目标框架”。
- 向你的 NuGet 项目添加以下后置生成事件:
"$(SolutionDir)NuGetPack.exe" "$(ProjectPath)" "$(TargetPath)" $(ConfigurationName)
- 为你要创建的每个其他 NuGet 包重复步骤 4-19。
- 构建你的解决方案。
- NuPkg(和 NuSpec)文件将位于输出文件夹(例如 bin\Debug、bin\Release)下。
更新
NuGetPack.exe 现在作为 NuGet 包可用,而 NuGet 包的项目模板现在作为 VSIX 可用。
关注点
下次,我将向你展示如何在 TFS 构建期间自动从自定义源拉取 NuGet 包依赖项,并将输出的 NuGet 包推送到任何源。