相关文章推荐
正直的手电筒  ·  Open ...·  3 周前    · 
还单身的消炎药  ·  Excel Open ...·  2 周前    · 
闯红灯的泡面  ·  ole2notofficexmlfileex ...·  2 周前    · 
温柔的桔子  ·  Caused by: ...·  11 月前    · 
火星上的油条  ·  win32gui - How to get ...·  11 月前    · 
小胡子的羽毛球  ·  windows ...·  1 年前    · 
  • .nuspec 用于 nuget.exe pack 使用 packages.config 的非 SDK 样式项目。

  • .nuspec 通常为使用 SDK 属性 () 的 .NET Core 和 .NET Standard 项目创建 SDK 样式项目的 包不需要文件。 (请注意,创建 package.) 时会生成 a .nuspec

    如果要使用 dotnet.exe pack msbuild pack target 创建包,我们建议将通常位于 .nuspec 项目文件中 的所有属性包含在 项目文件中。 但是,你可以改为选择 使用 .nuspec 文件来打包或 dotnet.exe msbuild pack target 打包文件。

  • 对于从 packages.config PackageReference 迁移到 PackageReference 的项目, .nuspec 无需创建包。 请改用 msbuild -t:pack

    常规形式和架构

    当前 nuspec.xsd 架构文件可在 NuGet GitHub 存储库 中找到。

    在此构架中, .nuspec 文件具有以下常规形式:

    <?xml version="1.0" encoding="utf-8"?>
    <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
        <metadata>
            <!-- Required elements-->
            <id></id>
            <version></version>
            <description></description>
            <authors></authors>
            <!-- Optional elements -->
            <!-- ... -->
        </metadata>
        <!-- Optional 'files' node -->
    </package>
    

    有关架构的清晰可视表示形式,请在 Visual Studio 中以“设计”模式打开架构文件,然后单击“XML 架构资源管理器”链接。 或者,将该文件作为代码打开,在编辑器中右键单击,然后选择“显示 XML 架构资源管理器”。 无论哪种方式,都会获得如下所示的视图(大多数部件都处于扩展状态):

    .nuspec 文件中的所有 XML 元素名称都区分大小写,一般情况下为 XML。 例如,使用元数据元素 <description> 正确且 <Description> 不正确。 下面记录了每个元素名称的正确大小写。

    所需的元数据元素

    尽管以下元素是包的最低要求,但应该考虑添加可选元数据元素以改善开发人员对包的整体体验。

    这些元素必须出现在 <metadata> 元素中。

    不区分大小写的包标识符,在 nuget.org 或包驻留的任意库中必须是唯一的。 ID 不得包含空格或对 URL 无效的字符,通常遵循 .NET 命名空间规则。 有关指南,请参阅选择唯一的包标识符

    将包上传到 nuget.org 时,字段 id 限制为 128 个字符。

    version

    遵循 major.minor.patch 模式的包版本。 版本号可能包括预发布后缀,如包版本控制中所述。

    将包上传到 nuget.org 时,字段 version 限制为 64 个字符。

    description

    UI 显示的包的说明。

    将包上传到 nuget.org 时,字段 description 限制为 4000 个字符。

    包作者的逗号分隔列表,与 nuget.org 上的配置文件名称匹配。这些内容显示在 nuget.org 上的NuGet库中,用于由同一作者交叉引用包。

    将包上传到 nuget.org 时,字段 authors 限制为 4000 个字符。

    可选元数据元素

    所有者已弃用。 请改用作者。

    使用 nuget.org 上的配置文件名称的包创建者的逗号分隔列表。这通常与在列表中 authors相同,在将包上传到 nuget.org 时将被忽略。请参阅 管理 nuget.org 上的包所有者

    projectUrl

    包的主页 URL,通常显示在 UI 中以及 nuget.org 中。

    将包上传到 nuget.org 时,字段 projectUrl 限制为 4000 个字符。

    licenseUrl

    licenseUrl 已弃用。 请改用许可证。

    包许可证的 URL,通常显示在 nuget.org 等 UI 中。

    将包上传到 nuget.org 时,字段 licenseUrl 限制为 4000 个字符。

    license

    NuGet 4.9.0 及更高版本支持

    包中许可证文件的 SPDX 许可证表达式或路径,通常显示在 NUGET.ORG 等 UI 中。如果要根据通用许可证(如 MIT 或 BSD-2-Clause)授权包,请使用关联的 SPDX 许可证标识符。 例如:

    <license type="expression">MIT</license>

    NuGet.org 仅接受开放源代码计划或免费软件基金会批准的许可证表达式。

    如果包根据多个通用许可证获得许可,则可以使用 SPDX 表达式语法版本 2.0 指定复合许可证。 例如:

    <license type="expression">BSD-2-Clause OR MIT</license>

    如果使用许可证表达式不支持的自定义许可证,则可以使用许可证的文本打包 .txt.md 文件。 例如:

    <package>
      <metadata>
        <license type="file">LICENSE.txt</license>
      </metadata>
      <files>
        <file src="licenses\LICENSE.txt" target="" />
      </files>
    </package>
    

    对于等效MSBuild,请查看打包许可证表达式或许可证文件

    下面在 ABNF 中描述了NuGet许可证表达式的确切语法。

    license-id            = <short form license identifier from https://spdx.org/spdx-specification-21-web-version#h.luq9dgcle9mo>
    license-exception-id  = <short form license exception identifier from https://spdx.org/spdx-specification-21-web-version#h.ruv3yl8g6czd>
    simple-expression = license-id / license-id”+”
    compound-expression =  1*1(simple-expression /
                    simple-expression "WITH" license-exception-id /
                    compound-expression "AND" compound-expression /
                    compound-expression "OR" compound-expression ) /                
                    "(" compound-expression ")" )
    license-expression =  1*1(simple-expression / compound-expression / UNLICENSED)
    

    iconUrl

    iconUrl 已弃用。 请改用图标。

    具有透明度背景的 128x128 图像的 URL,用作 UI 显示中包的图标。 请确保此元素包含直接图像 URL,而不是包含图像的网页的 URL。 例如,若要使用来自GitHub的映像,请使用用户名>/<存储库>/raw/<branch>/<logo.png>等https://github.com/<原始文件 URL。

    将包上传到 nuget.org 时,字段 iconUrl 限制为 4000 个字符。

    NuGet 5.3.0 及更高版本支持

    它是包中图像文件的路径,通常显示在 UI 中,如 nuget.org 作为包图标。 图像文件大小限制为 1 MB。 支持的文件格式包括 JPEG 和 PNG。 建议图像分辨率为 128x128。

    例如,使用 nuget.exe 创建包时,需将以下内容添加到 nuspec:

    <package>
      <metadata>
        <icon>images\icon.png</icon>
      </metadata>
      <files>
        <file src="..\icon.png" target="images\" />
      </files>
    </package>
    

    包图标 nuspec 示例。

    对于等效MSBuild,请查看打包图标图像文件

    可以同时指定这两个项 icon ,并保持 iconUrl 与不支持 icon的源的向后兼容性。 Visual Studio将在将来的版本中支持icon来自基于文件夹的源的包。

    NuGet 5.10.0 预览版 2 及更高版本支持

    打包自述文件时,需要使用 readme 元素来指定包路径,相对于包的根目录。 除此之外,还需要确保文件包含在包中。 支持的文件格式仅包括 Markdown (.md) 。

    例如,将以下内容添加到 nuspec,以便将自述文件与项目打包:

    <package>
      <metadata>
        <readme>docs\readme.md</readme>
      </metadata>
      <files>
        <file src="..\readme.md" target="docs\" />
      </files>
    </package>
    

    对于等效MSBuild,请查看打包自述文件

    requireLicenseAcceptance

    一个布尔值,用于指定客户端是否必须提示使用者接受包许可证后才可安装包。

    developmentDependency

    (2.8+) 一个布尔值,用于指定包是否被标记为仅开发依赖项,从而防止包作为依赖项包含到其他包中。 利用 PackageReference (NuGet 4.8+) ,此标志还意味着将从编译中排除编译时资产。 请参阅 对 PackageReference 的 DevelopmentDependency 支持

    summary 正在弃用。 请改用 description

    用于 UI 显示的包的简要说明。 如果省略,则使用 description 的截断版本。

    将包上传到 nuget.org 时,字段 summary 限制为 4000 个字符。

    releaseNotes

    (1.5+) 此版本包中所作更改的说明,通常代替包说明用在 UI 中,如 Visual Studio 包管理器的“更新”选项卡

    将包上传到 nuget.org 时,字段 releaseNotes 限制为 35,000 个字符。

    (1.5+) 包的版权详细信息

    将包上传到 nuget.org 时,字段 copyright 限制为 4000 个字符。

    包的区域设置 ID。 请参阅创建本地化包

    以空格分隔的标记和关键字列表,描述包并通过搜索和筛选辅助包的可发现性。

    将包上传到 nuget.org 时,字段 tags 限制为 4000 个字符。

    serviceable

    (3.3+) 仅限内部使用

    repository

    存储库元数据由四个可选属性组成: type (url 4.0+) ,以及 branchcommit (4.6+) 。 通过这些属性,可以映射到 .nupkg 生成它的存储库,并有可能像生成包的单个分支名称和/或提交 SHA-1 哈希一样详细。 这应该是可由版本控制软件直接调用的公开可用的 URL。 它不应是 HTML 页面,因为此页面适用于计算机。 若要链接到项目页,请改用 projectUrl 该字段。

    <?xml version="1.0"?>
    <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
        <metadata>
            <repository type="git" url="https://github.com/NuGet/NuGet.Client.git" branch="dev" commit="e1c65e4524cd70ee6e22abe33e6cb6ec73938cb3" />
        </metadata>
    </package>
    

    将包上传到 nuget.org 时,该 type 属性限制为 100 个字符,属性 url 限制为 4000 个字符。

    title

    包的友好标题,可用于某些 UI 显示。 (nuget.org 和Visual Studio中的程序包管理器不显示标题)

    将包上传到 nuget.org 时,字段 title 限制为 256 个字符,但不用于任何显示目的。

    packageTypes

    (3.5+) 如果不是传统的依赖项包,则为指定包类型的包括零个或多个 <packageType> 元素的集合。 每个 packageType 都具有 name 和 version 特性。 请参阅设置包类型

    零个或多个 <dependency> 元素的集合,用来指定包的依赖项。 每个 dependency 都具有 id、version、include (3.x+) 和 exclude (3.x+) 特性。 请参阅下面的依赖项

    frameworkAssemblies

    (1.2+) 零个或多个 <frameworkAssembly> 元素的集合,用来标识此包要求的 .NET Framework 程序集引用,从而确保引用添加到使用该包的项目。 每个 frameworkAssembly 都具有 assemblyName 和 targetFramework 特性。 请参阅下面的指定 Framework 程序集引用 GAC

    (1.5+) 零个或多个 <reference> 元素的集合,用来指定包的 lib 文件夹中添加为项目引用的程序集。 每个 reference 都具有 file 特性<references> 也可包含具有 targetFramework 特性的 <group> 元素,然后包含 <reference> 元素。 如果省略,则包含 lib 中的全部引用。 请参阅下面的指定显式程序集引用

    contentFiles

    (3.3+) <files> 元素的集合,用来标识包含在使用项目中的内容文件。 这些文件用一组特性指定,用于描述如何在项目系统中使用这些文件。 请参阅下面的指定包含在包中的文件

    files

    <package> 节点可能包含 <files> 节点作为同级节点 <metadata>以及 <contentFiles><metadata>节点,以指定要包含在包中的程序集和内容文件。 有关详细信息,请参阅本主题后面的包含程序集文件包含内容文件

    元数据属性

    minClientVersion

    指定可安装此包的最低 NuGet 客户端版本,并由 nuget.exe 和 Visual Studio 程序包管理器强制实施。 只要包依赖于特定 NuGet 客户端版本中添加的 .nuspec 文件的特定功能,就会使用此功能。 例如,使用 developmentDependency 特性的包应为 minClientVersion 指定“2.8”。 同样,使用 contentFiles 元素(请参阅下一部分)的包应将 minClientVersion 设置为“3.3”。 另请注意,早于 2.5 的 NuGet 客户端无法识别此标记,所以无论 minClientVersion 包含什么内容,它们总是拒绝安装该包

    <?xml version="1.0" encoding="utf-8"?>
    <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
        <metadata minClientVersion="100.0.0.1">
            <id>dasdas</id>
            <version>2.0.0</version>
            <title />
            <authors>dsadas</authors>
            <owners />
            <requireLicenseAcceptance>false</requireLicenseAcceptance>
            <description>My package description.</description>
        </metadata>
        <files>
            <file src="content\one.txt" target="content\one.txt" />
        </files>
    </package>
    

    创建包时,该命令将nuget pack文件<metadata>节点中的 .nuspec $分隔令牌替换为来自项目文件或pack命令-properties开关的值。

    在命令行中,可使用 nuget pack -properties <name>=<value>;<name>=<value> 指定令牌值。 例如,可使用 .nuspec 中的 $owners$$desc$ 令牌,并在封装时提供值,如下所示:

    nuget pack MyProject.csproj -properties
        owners=janedoe,harikm,kimo,xiaop;desc="Awesome app logger utility"
    

    如要使用项目中的值,请指定下表中描述的令牌(AssemblyInfo 指的是 Properties 中的文件,如 AssemblyInfo.csAssemblyInfo.vb)。

    若要使用这些令牌,请通过项目文件而不仅仅是 .nuspec 来运行 nuget pack。 例如,使用以下命令时,.nuspec 文件中的 $id$$version$ 令牌会被替换为项目的 AssemblyNameAssemblyVersion 值:

    nuget pack MyProject.csproj
    

    通常情况下,如果已有项目,最初会使用自动包含一些标准令牌的 nuget spec MyProject.csproj 创建 .nuspec。 然而,如果项目缺少要求的 .nuspec 元素的值,那么 nuget pack 失败。 此外,如果更改项目值,请确定在创建包之前重新生成,可通过 pack 命令的 build 开关方便地完成此操作。

    $configuration$ 外,项目中的值优先于在命令行上分配给相同令牌的任何值。

    包含程序集文件内容文件时,令牌也可用于解析路径。 这些令牌与 MSBuild 属性具有相同的名称,因此可根据当前生成配置来选择要包含的文件。 例如,如果在 .nuspec 文件中使用以下令牌:

    <files>
        <file src="bin\$configuration$\$id$.pdb" target="lib\net40" />
    </files>
    

    在 MSBuild 中生成具有 Release 配置且 AssemblyNameLoggingLibrary 的程序集,包中 .nuspec 文件中的结果行如下所示:

    <files>
        <file src="bin\Release\LoggingLibrary.pdb" target="lib\net40" />
    </files>
    

    Dependencies 元素

    <metadata> 中的 <dependencies> 元素包含任意数量的 <dependency> 元素,用来标识顶级包所依赖的其他包。 每个 <dependency> 的特性如下所示:

    例如,以下行指示 PackageA 版本 1.1.0 或更高版本,以及 PackageB 版本 1.x 的依赖项。

    <dependencies>
        <dependency id="PackageA" version="1.1.0" />
        <dependency id="PackageB" version="[1,2)" />
    </dependencies>
    

    以下行指示相同包上的依赖项,但指定包括 PackageAcontentFilesbuild 文件夹,以及除 PackageBnativecompile 文件夹以外的所有文件夹。

    <dependencies>
        <dependency id="PackageA" version="1.1.0" include="contentFiles, build" />
        <dependency id="PackageB" version="[1,2)" exclude="native, compile" />
    </dependencies>
    

    使用nuget spec从项目创建.nuspec依赖项时,项目中存在的依赖项不会自动包含在生成的.nuspec文件中。 请改用 nuget pack myproject.csproj.nuspec 文件,并从生成的 .nupkg 文件中获取 .nuspec 文件。 此 .nuspec 包含依赖项。

    版本 2.0+

    作为单个简单列表的替代方法,可使用 <dependencies> 中的 <group> 元素根据目标项目的框架配置文件指定依赖项。

    每个组都有一个名为 targetFramework 的特性,并包含零个或多个 <dependency> 元素。 当目标框架与项目的框架配置文件兼容时,将会一起安装这些依赖项。

    targetFramework 特性的 <group> 元素被用作依赖项的默认列表或回退列表。 有关确切的框架标识符,请参阅目标框架

    组格式不能与简单列表混合使用。

    与在lib/refdependency groups文件夹中使用的 TFM 相比,目标框架名字对象 (TFM) 的格式不同。 如果在文件中声明dependencies grouplib/ref.nuspec的目标框架没有完全匹配,则pack命令将引发NuGet警告 NU5128

    以下示例显示了 <group> 元素的不同变体:

    <dependencies>
        <group>
            <dependency id="RouteMagic" version="1.1.0" />
        </group>
        <group targetFramework=".NETFramework4.7.2">
            <dependency id="jQuery" version="1.6.2" />
            <dependency id="WebActivator" version="1.4.4" />
        </group>
        <group targetFramework="netcoreapp3.1">
        </group>
    </dependencies>
    

    显式程序集引用

    项目 <references> 使用 packages.config 元素来显式指定目标项目在使用包时应引用的程序集。 显式引用通常用于仅设计时程序集。 有关详细信息,请参阅有关 选择项目引用的程序集 的页面了解详细信息。

    例如,以下 <references> 元素指示 NuGet 仅对 xunit.dllxunit.extensions.dll 添加引用,即使包中还有其他程序集:

    <references>
        <reference file="xunit.dll" />
        <reference file="xunit.extensions.dll" />
    </references>
    

    作为单个简单列表的替代方法,可使用 <references> 中的 <group> 元素根据目标项目的框架配置文件指定引用。

    每个组都有一个名为 targetFramework 的特性,并包含零个或多个 <reference> 元素。 当目标框架与项目的框架配置文件兼容时,会将引用添加到项目中。

    targetFramework 特性的 <group> 元素被用作引用的默认列表或回退列表。 有关确切的框架标识符,请参阅目标框架

    组格式不能与简单列表混合使用。

    以下示例显示了 <group> 元素的不同变体:

    <references>
        <group>
            <reference file="a.dll" />
        </group>
        <group targetFramework="net45">
            <reference file="b45.dll" />
        </group>
        <group targetFramework="netcore45">
            <reference file="bcore45.dll" />
        </group>
    </references>
    

    Framework 程序集引用

    Framework 程序集是 .NET Framework 的一部分,并已存在于任何给定计算机的全局程序集缓存 (GAC) 中。 通过在 <frameworkAssemblies> 元素中标识这些程序集,包可确保在项目尚未具有此类引用的情况下,将必需的引用添加到项目中。 当然,此类程序集不直接包含在包中。

    <frameworkAssemblies> 元素包含零个或多个 <frameworkAssembly> 元素,这些元素指定以下特性:

    以下示例显示了对全部目标框架的 System.Net 的引用,以及对仅用于 .NET Framework 4.0 的 System.ServiceModel 的引用:

    <frameworkAssemblies>
        <frameworkAssembly assemblyName="System.Net"  />
        <frameworkAssembly assemblyName="System.ServiceModel" targetFramework="net40" />
    </frameworkAssemblies>
    

    包含程序集文件

    如果遵循创建包中介绍的约定,则不必在 .nuspec 文件中显式指定文件列表。 nuget pack 命令自动选取所需的文件。

    当包安装到项目中时,NuGet 自动将程序集引用添加到包的 DLL,不包括命名为 .resources.dll 的内容,因为它们被假定为本地化的附属程序集。 为此,请避免对包含基本包代码的文件使用 .resources.dll

    若要绕过此自动行为,并显式控制包中包含的文件,请将 <files> 元素作为 <package> 的子元素(和 <metadata> 的同级元素),并使用单独的 <file> 元素标识每个文件。 例如:

    <files>
        <file src="bin\Debug\*.dll" target="lib" />
        <file src="bin\Debug\*.pdb" target="lib" />
        <file src="tools\**\*.*" exclude="**\*.log" />
    </files>
    

    在 NuGet 2.x 及更早版本中,如果项目使用 packages.config,在安装包时,<files> 元素也用于包含不可变的内容文件。 通过 NuGet 3.3+ 和项目 PackageReference,将改为使用 <contentFiles> 元素。 有关详细信息,请参阅下面的包含内容文件

    文件元素特性

    每个 <file> 元素指定以下特性:

    文件或要包含的文件位置,受 exclude 特性指定排除规则约束。 路径是相对于 .nuspec 文件的路径,除非指定了绝对路径。 允许使用通配符 *,双通配符 ** 意味着递归文件夹搜索。 放置源文件的包中文件夹的相对路径,必须以 libcontentbuildtools 开头。 请参阅从基于约定的工作目录创建 .nuspec。 要从 src 位置排除的文件或文件模式的分号分隔列表。 允许使用通配符 *,双通配符 ** 意味着递归文件夹搜索。

    单个程序集

    Source file:
        library.dll
    .nuspec entry:
        <file src="library.dll" target="lib" />
    Packaged result:
        lib\library.dll
    

    特定于目标框架的单个程序集

    Source file:
        library.dll
    .nuspec entry:
        <file src="assemblies\net40\library.dll" target="lib\net40" />
    Packaged result:
        lib\net40\library.dll
    

    使用通配符的 DLL 集

    Source files:
        bin\release\libraryA.dll
        bin\release\libraryB.dll
    .nuspec entry:
        <file src="bin\release\*.dll" target="lib" />
    Packaged result:
        lib\libraryA.dll
        lib\libraryB.dll
    

    适用于不同框架的 DLL

    Source files:
        lib\net40\library.dll
        lib\net20\library.dll
    .nuspec entry (using ** recursive search):
        <file src="lib\**" target="lib" />
    Packaged result:
        lib\net40\library.dll
        lib\net20\library.dll
    
    Source files:
        \tools\fileA.bak
        \tools\fileB.bak
        \tools\fileA.log
        \tools\build\fileB.log
    .nuspec entries:
        <file src="tools\*.*" target="tools" exclude="tools\*.bak" />
        <file src="tools\**\*.*" target="tools" exclude="**\*.log" />
    Package result:
        (no files)
    

    包含内容文件

    内容文件是包需要包含在项目中的不可变文件。 不可变文件指的是使用项目不会修改的文件。 内容文件示例包括:

  • 作为资源嵌入的图像
  • 已编译的源文件
  • 需要包含在项目的生成输出中的脚本
  • 需要包含在项目中,但不需要进行任何项目特定的更改的包的配置文件
  • 内容文件使用 <files> 元素包含在包中,并在 target 特性中指定 content 文件夹。 但是,使用 PackageReference(而不是使用 <contentFiles> 元素)将包安装到项目中时,将忽略这些文件。

    为了最大限度地兼容使用项目,一个包最好在两个元素中指定内容文件。

    对内容文件使用文件元素

    对于内容文件,只需使用与程序集文件相同的格式,但应在 target 属性中将 content 指定为基本文件夹,如以下示例所示。

    基本内容文件

    Source files:
        css\mobile\style1.css
        css\mobile\style2.css
    .nuspec entry:
        <file src="css\mobile\*.css" target="content\css\mobile" />
    Packaged result:
        content\css\mobile\style1.css
        content\css\mobile\style2.css
    

    具有目录结构的内容文件

    Source files:
        css\mobile\style.css
        css\mobile\wp7\style.css
        css\browser\style.css
    .nuspec entry:
        <file src="css\**\*.css" target="content\css" />
    Packaged result:
        content\css\mobile\style.css
        content\css\mobile\wp7\style.css
        content\css\browser\style.css
    

    特定于目标框架的内容文件

    Source file:
        css\cool\style.css
    .nuspec entry
        <file src="css\cool\style.css" target="Content" />
    Packaged result:
        content\style.css
    

    复制到名称中带点的文件夹的内容文件

    在此情况下,NuGet 发现 target 中的扩展名与 src 中的扩展名不匹配,因此将 target 中名称的该部分作为文件夹:

    Source file:
        images\picture.png
    .nuspec entry:
        <file src="images\picture.png" target="Content\images\package.icons" />
    Packaged result:
        content\images\package.icons\picture.png
    

    不具有扩展名的内容文件

    若要包含不具有扩展名的文件,请使用 *** 通配符:

    Source file:
        flags\installed
    .nuspec entry:
        <file src="flags\**" target="flags" />
    Packaged result:
        flags\installed
    

    具有深层路径和深层目标的内容文件

    在此情况下,由于源文件和目标文件的扩展名匹配,NuGet 假定目标是文件名而不是文件夹:

    Source file:
        css\cool\style.css
    .nuspec entry:
        <file src="css\cool\style.css" target="Content\css\cool" />
        <file src="css\cool\style.css" target="Content\css\cool\style.css" />
    Packaged result:
        content\css\cool\style.css
    

    重命名包中的内容文件

    Source file:
        ie\css\style.css
    .nuspec entry:
        <file src="ie\css\style.css" target="Content\css\ie.css" />
    Packaged result:
        content\css\ie.css
    
    Source file:
        docs\*.txt (multiple files)
    .nuspec entry:
        <file src="docs\*.txt" target="content\docs" exclude="docs\admin.txt" />
        <file src="*.txt" target="content\docs" exclude="admin.txt;log.txt" />
    Packaged result:
        All .txt files from docs except admin.txt (first example)
        All .txt files from docs except admin.txt and log.txt (second example)
    

    对内容文件使用 contentFiles 元素

    NuGet 4.0+ 与 PackageReference

    默认情况下,包将内容放置在 contentFiles 文件夹中(见下文),nuget pack 使用默认特性将全部文件包含在该文件夹中。 在此情况下,根本没有必要在 .nuspec 中包含 contentFiles 节点。

    若要控制包含哪些文件,<contentFiles> 元素指定是 <files> 元素的集合,可标识包含的确切文件。

    这些文件用一组特性指定,用于描述如何在项目系统中使用这些文件:

    (必需)文件或要包含的文件位置,受 exclude 特性指定的排除规则约束。 路径相对于 contentFiles 文件夹,除非指定绝对路径。 允许使用通配符 *,双通配符 ** 意味着递归文件夹搜索。 要从 src 位置排除的文件或文件模式的分号分隔列表。 允许使用通配符 *,双通配符 ** 意味着递归文件夹搜索。 buildAction 要分配给MSBuild的内容项的生成操作,例如Content,、NoneEmbedded ResourceCompile等。默认值为 Compile. copyToOutput 一个布尔值,指示是将内容项复制到生成 (还是发布) 输出文件夹。 默认值为 false。 flatten 一个布尔值,用于指示是将内容项复制到生成输出中的单个文件夹 (true),还是保留包中的文件夹结构 (false)。 此标志仅在 copyToOutput 标志设置为 true 时才有效。 默认值为 false。

    安装包时,NuGet 从上到下应用 <contentFiles> 的子元素。 如果多个条目与相同的文件匹配,那么应用全部条目。 如果相同特性发生冲突,则最上面的条目将替代靠下的条目。

    包文件夹结构

    包项目应使用以下模式构建内容结构:

    /contentFiles/{codeLanguage}/{TxM}/{any?}
    
  • codeLanguages 可以是 csvbfsany 或给定 $(ProjectLanguage) 的小写等效形式
  • TxM 是 NuGet 支持的任何合法目标框架名字对象(请参阅目标框架)。
  • 任何文件夹结构都可以附加到此语法的末尾。
  • Language- and framework-agnostic:
        /contentFiles/any/any/config.xml
    net45 content for all languages
        /contentFiles/any/net45/config.xml
    C#-specific content for net45 and up
        /contentFiles/cs/net45/sample.cs
    

    空文件夹可以使用 . 来选择不提供特定语言和 TxM 组合的内容,例如:

    /contentFiles/vb/any/code.vb
    /contentFiles/cs/any/.
    

    contentFiles 部分示例

    <?xml version="1.0" encoding="utf-8"?>
    <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
        <metadata>
            <contentFiles>
                <!-- Embed image resources -->
                <files include="any/any/images/dnf.png" buildAction="EmbeddedResource" />
                <files include="any/any/images/ui.png" buildAction="EmbeddedResource" />
                <!-- Embed all image resources under contentFiles/cs/ -->
                <files include="cs/**/*.png" buildAction="EmbeddedResource" />
                <!-- Copy config.xml to the root of the output folder -->
                <files include="cs/uap/config/config.xml" buildAction="None" copyToOutput="true" flatten="true" />
                <!-- Copy run.cmd to the output folder and keep the directory structure -->
                <files include="cs/commands/run.cmd" buildAction="None" copyToOutput="true" flatten="false" />
                <!-- Include everything in the scripts folder except exe files -->
                <files include="cs/net45/scripts/*" exclude="**/*.exe"  buildAction="None" copyToOutput="true" />
            </contentFiles>
            </metadata>
    </package>
    

    框架参考组

    仅限版本 5.1+ wih PackageReference

    框架引用是表示共享框架(如 WPF 或 Windows 窗体)的 .NET Core 概念。 通过指定共享框架,包可确保引用项目中包括其所有框架依赖项。

    每个 <group> 元素都需要一个 targetFramework 属性和零个或多个 <frameworkReference> 元素。

    以下示例演示为 .NET Core WPF 项目生成的 nuspec。 请注意,不建议手动创作包含框架引用的 nuspec。 请考虑改用 目标 包,这将从项目自动推断它们。

    <package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
      <metadata>
        <dependencies>
          <group targetFramework=".NETCoreApp3.1" />
        </dependencies>
        <frameworkReferences>
          <group targetFramework=".NETCoreApp3.1">
            <frameworkReference name="Microsoft.WindowsDesktop.App.WPF" />
          </group>
        </frameworkReferences>
      </metadata>
    </package>
    

    示例 nuspec 文件

    未指定依赖项或文件的简单 .nuspec

    <?xml version="1.0" encoding="utf-8"?>
    <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
        <metadata>
            <id>sample</id>
            <version>1.2.3</version>
            <authors>Kim Abercrombie, Franck Halmaert</authors>
            <description>Sample exists only to show a sample .nuspec file.</description>
            <language>en-US</language>
            <projectUrl>http://xunit.codeplex.com/</projectUrl>
            <license type="expression">MIT</license>
        </metadata>
    </package>
    

    具有依赖项的 .nuspec

    <?xml version="1.0" encoding="utf-8"?>
    <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
        <metadata>
            <id>sample</id>
            <version>1.0.0</version>
            <authors>Microsoft</authors>
            <dependencies>
                <dependency id="another-package" version="3.0.0" />
                <dependency id="yet-another-package" version="1.0.0" />
            </dependencies>
        </metadata>
    </package>
    

    具有文件的 .nuspec

    <?xml version="1.0"?>
    <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
        <metadata>
            <id>routedebugger</id>
            <version>1.0.0</version>
            <authors>Jay Hamlin</authors>
            <requireLicenseAcceptance>false</requireLicenseAcceptance>
            <description>Route Debugger is a little utility I wrote...</description>
        </metadata>
        <files>
            <file src="bin\Debug\*.dll" target="lib" />
        </files>
    </package>
    

    具有 Framework 程序集的 .nuspec

    <?xml version="1.0"?>
    <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
        <metadata>
            <id>PackageWithGacReferences</id>
            <version>1.0</version>
            <authors>Author here</authors>
            <requireLicenseAcceptance>false</requireLicenseAcceptance>
            <description>
                A package that has framework assemblyReferences depending
                on the target framework.
            </description>
            <frameworkAssemblies>
                <frameworkAssembly assemblyName="System.Web" targetFramework="net40" />
                <frameworkAssembly assemblyName="System.Net" targetFramework="net40-client, net40" />
                <frameworkAssembly assemblyName="Microsoft.Devices.Sensors" targetFramework="sl4-wp" />
                <frameworkAssembly assemblyName="System.Json" targetFramework="sl3" />
            </frameworkAssemblies>
        </metadata>
    </package>
    

    在此示例中,为特定的项目目标安装了以下内容:

  • .NET4 ->System.WebSystem.Net
  • .NET4 客户端配置文件 ->System.Net
  • Silverlight 3 ->System.Json
  • WindowsPhone ->Microsoft.Devices.Sensors
  •