65.9K
CodeProject 正在变化。 阅读更多。
Home

自动创建 NuGet 包

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2014 年 8 月 5 日

LGPL3

5分钟阅读

viewsIcon

60313

快速、稳定、强大的 NuGet 包创建

引言

本文将介绍一个简单、快速、自动化且功能齐全的开源解决方案,用于创建 NuGet 包。

背景

创建 NuGet 包有许多方法,例如:

  • 手动创建 NuSpec XML 文件,然后使用 NuGet.exe 创建 NuPkg 文件
  • 使用 NuGet Package Explorer
  • 安装 Visual Studio 的插件
  • 使用自定义 TFS 模板

我创建 NuGet 包的目标是:

  1. 在 TFS 构建期间自动创建包
  2. 在本地构建期间自动创建包
  3. 快速创建包,以便本地构建不会耗时太长
  4. 同步程序集版本号与包版本号
  5. 启用为包自动分配预发行版本号
  6. 支持从解决方案中打包多个程序集
  7. 启用自动列出外部(NuGet 包)依赖项
  8. 支持对同一解决方案中(同一构建期间)构建的内部 NuGet 包的依赖项
  9. 启用在包中包含源代码以便于单步调试
  10. 在每次构建时自动刷新源代码文件列表
  11. 不崩溃

然而,现有的选项都无法满足这些目标。

Using the Code

  1. 创建版本号的来源
    在解决方案中添加一个名为 VersionInfo.cs(或其他名称)的共享文件,并在其中包含以下属性:
    1. AssemblyCompany,在此下方填写你的公司名称作者的名称
    2. AssemblyTrademark,在此下方填写项目 URL(确保许可证也在此 URL 下)。
    3. AssemblyFileVersion,在此下方填写程序集 NuGet 包的版本号,例如 1.2.3.0。将第四个数字保留为 0,因为它将被忽略。
    4. 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
  2. 同步项目之间的版本号
    Alt+拖动 VersionInfo.cs 文件到你希望包含在包中的所有程序集。 (Alt+拖动会在新位置创建文件的链接,而不是复制它。)
  3. AssemblyInfo.cs 文件中移除 AssemblyCompanyAssemblyTrademarkAssemblyFileVersionAssemblyInformationalVersion 属性,以防止重复属性(这会导致构建失败)。
  4. 使用标准的“添加”对话框(是的,是标准的类库模板!)在解决方案中添加一个新的项目用于你的 NuGet 包。命名为 YourNuGetPackageName.NuGet.NuGet 是可选的)。
  5. 为新项目重复步骤 2+3(添加 VersionInfo.cs 的链接,从 AssemblyInfo.cs 中移除重复项)。
  6. 从新的 NuGet 项目添加引用到你希望包含在包中的同一解决方案内的任何程序集。
  7. 为该包应依赖的任何外部 NuGet 包,向新的 NuGet 项目添加 NuGet 包
  8. 内部 NuGet 依赖项:如果你的包依赖于在同一解决方案中创建的其他 NuGet 包
    1. 向新的 NuGet 项目添加一个名为 internalPackages.config 的文本文件(你可以复制 packages.config 并重命名它)。
    2. 编辑 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>
  9. AssemblyInfo.cs 中的 AssemblyTitle 属性中列出你希望为你的包设置的任何标签
  10. AssemblyInfo.cs 中的 AssemblyDescription 属性中为你的包添加描述
  11. 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("")]
  12. NuGet.exeNuGetPack.exe 添加到你的解决方案文件夹 + 添加解决方案本身(以便 TFS 构建可以使用它们)。
    1. NuGet.exe 是你已经拥有的标准 NuGet.exe 文件。
    2. NuGetPack.exe 可在 https://pubcomp.codeplex.com/ 处获取源代码和二进制文件。
  13. 可选:或者,你可以通过向包项目添加一个名为 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>
    
  14. 如果你使用“添加框架引用”选项,请移除包项目中不需要的框架引用。
  15. 可选:你可以在包项目的一个名为 content 的文件夹下包含 内容
    可以通过按住 ALT 键拖动文件,或者在使用“添加现有项”菜单选项时,使用“添加”按钮上的“添加为链接”下拉选项,将内容文件添加为链接,而不是原始文件的副本。
  16. 可选:你可以在包项目的一个名为 lib 的文件夹下包含(非 NuGet)二进制文件。要包含特定 .NET Framework 版本的二进制文件,请将它们放在子文件夹下,例如 lib\net20lib\net40 等。
    与内容文件一样,这些文件可以添加为链接或原始文件的副本。
  17. 可选:你可以通过将项目添加到包项目的一个名为 sln 的文件夹下,来包含要保留在包文件夹中但未添加到任何项目中的项。
    与内容文件一样,这些文件可以添加为链接或原始文件的副本。
  18. 你的包依赖的 .NET Framework 版本由包项目的框架版本决定。要更改它,请通过项目属性更改包项目的“目标框架”。
  19. 向你的 NuGet 项目添加以下后置生成事件
    "$(SolutionDir)NuGetPack.exe" "$(ProjectPath)" "$(TargetPath)" $(ConfigurationName)
  20. 为你要创建的每个其他 NuGet 包重复步骤 4-19。
  21. 构建你的解决方案。
  22. NuPkg(和 NuSpec)文件将位于输出文件夹(例如 bin\Debugbin\Release)下。

更新

NuGetPack.exe 现在作为 NuGet 包可用,而 NuGet 包的项目模板现在作为 VSIX 可用

关注点

下次,我将向你展示如何在 TFS 构建期间自动从自定义源拉取 NuGet 包依赖项,并将输出的 NuGet 包推送到任何源。

© . All rights reserved.