添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

NuGet 4.0+

使用 PackageReference 格式, NuGet 4.0+ 可以直接将所有清单元数据存储在项目文件中,而不是使用单独的 .nuspec 文件。

MSBuild 15.1+ NuGet 也是一流的MSBuild公民,其 pack 目标和 restore 目标如下。 这些目标允许你像处理任何其他MSBuild任务或目标一样使用NuGet。 For instructions creating a NuGet package using MSBuild, see Create a NuGet package using MSBuild . (对于 NuGet 3.x 及更早版本,请改用 还原 命令。 NuGet )

目标生成顺序

由于 pack 并且 restore 是 MSBuild 目标,因此可以访问它们来增强工作流。 例如,假设在打包包后要将包复制到网络共享。 此操作可通过向项目文件中添加以下内容来完成:

<Target Name="CopyPackage" AfterTargets="Pack">
    SourceFiles="$(OutputPath)..\$(PackageId).$(PackageVersion).nupkg"
    DestinationFolder="\\myshare\packageshare\"
</Target>

同样,可以编写任务、编写 MSBuild 自己的目标并使用 NuGet 任务中的 MSBuild 属性。

$(OutputPath) 是相对的,需要从项目根目录运行命令。

对于使用格式 PackageReference 的 .NET 项目,使用 msbuild -t:pack 从项目文件中绘制输入以用于创建 NuGet 包。

下表描述了 MSBuild 可在第一个 <PropertyGroup> 节点内添加到项目文件的属性。 在 Visual Studio 2017 及更高版本中,通过右键单击项目并选择上下文菜单上的“编辑 {project_name}”,即可轻松进行这些编辑。 为方便起见,表由文件中的等效属性.nuspec进行组织。

Owners不支持 .nuspecMSBuild中的属性和Summary属性。

PackageVersion 这与 semver 兼容,例如 1.0.01.0.0-beta1.0.0-beta-00345。 默认值为 Version 如果未设置。 VersionPrefix VersionPrefix empty 设置 PackageVersion 覆盖 VersionPrefix VersionSuffix VersionSuffix empty 设置 PackageVersion 覆盖 VersionSuffix Authors Authors 当前用户的用户名 包作者的分号分隔列表,与 nuget.org 上的配置文件名称匹配。这些内容显示在 nuget.org 上的 NuGet 库中,用于由同一作者交叉引用包。 Owners 不存在 nuspec Title Title $(PackageId) 明了易用的包标题,通常用在 UI 显示中,如 nuget.org 上和 Visual Studio 中包管理器上的那样。 Description Description “包描述” 程序集的详细说明。 如果未指定 PackageDescription,则此属性还可用作包的说明。 empty 包的版权详细信息。 RequireLicenseAcceptance PackageRequireLicenseAcceptance false 一个布尔值,指定客户端是否必须提示使用者接受包许可证后才可安装包。 license PackageLicenseExpression empty 对应到 <license type="expression">。 请参阅 打包许可证表达式或许可证文件license PackageLicenseFile empty 如果使用自定义许可证或尚未分配 SPDX 标识符的许可证,则包中许可证文件的路径。 需要显式打包引用的许可证文件。 对应到 <license type="file">。 请参阅 打包许可证表达式或许可证文件LicenseUrl PackageLicenseUrl empty PackageLicenseUrl 已弃用。 请改用 PackageLicenseExpressionPackageLicenseFileProjectUrl PackageProjectUrl empty PackageIcon empty 包中要用作包图标的图像的路径。 需要显式打包引用的图标图像文件。 有关详细信息,请参阅打包图标图像文件和icon元数据IconUrl PackageIconUrl empty PackageIconUrl 被弃用为赞成 PackageIcon。 但是,为了获得最佳下层体验,除了指定之外,还应指定PackageIconUrlPackageIconReadme PackageReadmeFile empty 需要显式打包引用的自述文件。 PackageTags empty 标记的分号分隔列表,这些标记用于指定包。 ReleaseNotes PackageReleaseNotes empty 包的发行说明。 Repository/Url RepositoryUrl empty 用于克隆或检索源代码的存储库 URL。 示例: https://github.com/NuGethttps://github.com/NuGet/NuGet.Client.gitRepository/Type RepositoryType empty 存储库类型。 示例: git (默认) 。 tfs Repository/Branch RepositoryBranch empty 可选存储库分支信息。 还必须指定 RepositoryUrl 才能包含此属性。 示例: master (NuGet 4.7.0+) 。 Repository/Commit RepositoryCommit empty 可选的存储库提交或更改集,指示针对其生成包的源。 还必须指定 RepositoryUrl 才能包含此属性。 示例: 0e4d1b598f350b3dc675018d539114d1328189ef (NuGet 4.7.0+) 。 PackageType <PackageType>CustomType1, 1.0.0.0;CustomType2</PackageType> 指示包的预期用途。 包类型使用与包 ID 相同的格式,并用分隔符 ;。 可以通过追加一个 , 和一个 Version 字符串来对包类型进行版本控制。 请参阅 (NuGet 3.5.0+) 设置NuGet包类型Summary DevelopmentDependency 一个布尔值,用于指定包是否被标记为仅开发依赖项,从而防止包作为依赖项包含到其他包中。 使用 PackageReference (NuGet 4.8+) ,此标志还意味着编译时资产被排除在编译之外。 有关详细信息,请参阅 PackageReference 的 DevelopmentDependency 支持PackageLicenseExpression 例如Apache-2.0,SPDX 许可证标识符或表达式。 有关详细信息,请参阅 打包许可证表达式或许可证文件PackageLicenseFile 如果使用自定义许可证或尚未分配 SPDX 标识符的许可证的许可证,则包中许可证文件的路径。 PackageLicenseUrl PackageLicenseUrl 已弃用。 请改用 PackageLicenseExpressionPackageLicenseFilePackageProjectUrl PackageIcon 指定包图标路径,相对于包的根目录。 有关详细信息,请参阅 打包图标图像文件PackageReleaseNotes 包的发行说明。 PackageReadmeFile 包的自述文件。 PackageTags 标记的分号分隔列表,这些标记用于指定包。 PackageOutputPath 确定用于已打包的包的输出路径。 默认值为 $(OutputPath)IncludeSymbols 此布尔值指示在打包项目时,包是否应创建一个附加的符号包。 符号包的格式由 SymbolPackageFormat 属性控制。 有关详细信息,请参阅 IncludeSymbolsIncludeSource 此布尔值指示包进程是否应创建源包。 源包中包含库的源代码以及 PDB 文件。 源文件置于生成的包文件中的 src/ProjectName 目录下。 有关详细信息,请参阅 IncludeSourcePackageType IsTool 指定是否将所有输出文件复制到 tools 文件夹,而不是 lib 文件夹。 有关详细信息,请参阅 IsToolRepositoryUrl 用于克隆或检索源代码的存储库 URL。 示例: https://github.com/NuGethttps://github.com/NuGet/NuGet.Client.gitRepositoryType 存储库类型。 示例: git (默认) , tfs RepositoryBranch 可选存储库分支信息。 还必须指定 RepositoryUrl 才能包含此属性。 示例: master (NuGet 4.7.0+) 。 RepositoryCommit 可选的存储库提交或更改集,指示针对其生成包的源。 还必须指定 RepositoryUrl 才能包含此属性。 示例: 0e4d1b598f350b3dc675018d539114d1328189ef (NuGet 4.7.0+) 。 SymbolPackageFormat 指定符号包的格式。 如果为“symbols.nupkg”,则会使用包含 PDB、DLL 和其他输出文件的 .symbols.nupkg 扩展创建旧符号包。 如果为“snupkg”,则会创建包含可移植 PDB 的 snupkg 符号包。 默认值为“symbols.nupkg”。 NoPackageAnalysis 指定 pack 生成包后不应运行包分析。 MinClientVersion 指定可由nuget.exe和Visual Studio 程序包管理器强制执行的可安装此包的客户端的最低版本NuGet。 IncludeBuildOutput 此布尔值指定是否应将生成输出程序集打包到 .nupkg 文件中 。 IncludeContentInPack 此布尔值指定是否自动将具有类型的任何 Content 项包含在生成的包中。 默认为 trueBuildOutputTargetFolder 指定放置输出程序集的文件夹。 输出程序集(和其他输出文件)会复制到各自的框架文件夹中。 有关详细信息,请参阅 输出程序集ContentTargetFolders 指定如果未为其指定所有内容文件 PackagePath 的默认位置。 默认值为“content;contentFiles”。 有关详细信息,请参阅在包中包含内容NuspecFile 用于打包的文件的 .nuspec 相对路径或绝对路径。 如果指定,则 仅用于 打包信息,并且不使用项目中的任何信息。 有关详细信息,请参阅 使用 .nuspec. NuspecBasePath 文件的基路径 .nuspec 。 有关详细信息,请参阅 使用 .nuspec. NuspecProperties 键=值对的分号分隔列表。 有关详细信息,请参阅 使用 .nuspec.

禁止依赖项

若要禁止来自生成的NuGet包的包依赖项,请设置为trueSuppressDependenciesWhenPacking允许跳过生成的 nupkg 文件中的所有依赖项。

PackageIconUrl

PackageIconUrl 弃用 PackageIcon 该属性。 从 NuGet 5.3 和 Visual Studio 2019 版本 16.3 开始,如果包元数据仅指定PackageIconUrlpack则引发 NU5048 警告。

PackageIcon

若要保持与尚PackageIcon不支持的客户端和源的向后兼容性,请同时指定和PackageIconPackageIconUrl。 Visual Studio支持PackageIcon来自基于文件夹的源的包。

打包图标图像文件

打包图标图像文件时,使用 PackageIcon 属性指定相对于包根目录的图标文件路径。 此外,请确保文件包含在包中。 图像文件大小限制为 1 MB。 支持的文件格式包括 JPEG 和 PNG。 建议图像分辨率为 128x128。

<PropertyGroup>
    <PackageIcon>icon.png</PackageIcon>
</PropertyGroup>
<ItemGroup>
    <None Include="images\icon.png" Pack="true" PackagePath="\"/>
</ItemGroup>

包图标示例

对于等效项 nuspec ,请查看 nuspec 图标的参考

PackageReadmeFile

支持 NuGet 5.10.0 预览版 2.NET / SDK 5.0.300 及更高版本

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

<PropertyGroup>
    <PackageReadmeFile>readme.md</PackageReadmeFile>
</PropertyGroup>
<ItemGroup>
    <None Include="docs\readme.md" Pack="true" PackagePath="\"/>
</ItemGroup>

对于等效项 nuspec ,请查看 nuspec 自述文件参考

输出程序集

nuget pack 会复制扩展名为 .exe.dll.xml.winmd.json.pri 的输出文件。 复制的输出文件取决于目标BuiltOutputProjectGroup提供的内容MSBuild。

可以在项目文件或命令行中使用两 MSBuild 个属性来控制输出程序集的位置:

  • IncludeBuildOutput:确定包中是否应包括生成输出程序集的布尔值。
  • BuildOutputTargetFolder:指定应放置输出程序集的文件夹。 输出程序集(和其他输出文件)会复制到各自的框架文件夹中。
  • 请参阅项目文件中的包引用

    项目到项目的引用

    默认情况下,项目引用Project被视为NuGet包引用。 例如:

    <ProjectReference Include="..\UwpLibrary2\UwpLibrary2.csproj"/>
    

    也可将以下元数据添加到项目引用:

    <IncludeAssets>
    <ExcludeAssets>
    <PrivateAssets>
    

    在包中添加内容

    若要添加内容,请将额外的元数据添加到现有的 <Content> 项。 默认情况下,类型“Content”的所有内容都包括在包中,除非使用以下条目替代:

    <Content Include="..\win7-x64\libuv.txt">
     <Pack>false</Pack>
    </Content>
    

    默认情况下,所有内容都添加到包中 contentcontentFiles\any\<target_framework> 文件夹根目录,并保留相对文件夹结构,除非指定包路径:

    <Content Include="..\win7-x64\libuv.txt">
      <Pack>true</Pack>
      <PackagePath>content\myfiles\</PackagePath>
    </Content>
    

    如果要仅将所有内容复制到特定根文件夹 (contentcontentFiles) (而不是) ,则可以使用 MSBuild 属性,该属性 ContentTargetFolders默认为“content;contentFiles”,但可以设置为任何其他文件夹名称。 请注意,基于 buildAction,仅在 ContentTargetFolders 中指定“contentFiles”会将文件置于 contentFiles\any\<target_framework>contentFiles\<language>\<target_framework> 下。

    PackagePath 可以是一组以分号分隔的目标路径。 指定空的包路径会将文件添加到包的根目录。 例如,以下操作会将 libuv.txt 添加到 content\myfilescontent\samples 和包的根目录:

    <Content Include="..\win7-x64\libuv.txt">
      <Pack>true</Pack>
      <PackagePath>content\myfiles;content\sample;;</PackagePath>
    </Content>
    

    还有一个 MSBuild 属性,该属性 $(IncludeContentInPack)默认为 true。 如果在任何项目中将此值设置为 false,则该项目的内容不会包括在 nuget 包中。

    可以在上述任何项上设置的其他包特定元数据包括<PackageCopyToOutput><PackageFlatten>输出nuspec中条目的集CopyToOutputFlattencontentFiles

    除了“Content”项,<Pack><PackagePath> 元数据还可以在具有 Compile、EmbeddedResource、ApplicationDefinition、Page、Resource、SplashScreen、DesignData、DesignDataWithDesignTimeCreateableTypes、CodeAnalysisDictionary、AndroidAsset、AndroidResource、BundleResource 或 None 生成操作的文件上进行设置。

    使用通配模式时,对于将包的文件名追加到包路径,包路径必须以文件夹分隔符结尾,否则包路径将被视为包括文件名的完整路径。

    IncludeSymbols

    使用 MSBuild -t:pack -p:IncludeSymbols=true 时,相应的 .pdb 文件将随其他输出文件(.dll.exe.winmd.xml.json.pri)一起复制。 请注意,设置 IncludeSymbols=true 会创建常规包和符号包

    IncludeSource

    这与 IncludeSymbols 相同,但它还会连同 .pdb 文件复制源文件。 类型为 Compile 的所有文件都会复制到 src\<ProjectName>\,并保留生成包中的相对路径文件夹结构。 对于将 TreatAsPackageReference 设置为 false 的任何 ProjectReference 的源文件也是如此。

    如果类型为 Compile 的文件位于项目文件夹外,则它只添加到了 src\<ProjectName>\

    打包许可证表达式或许可证文件

    使用许可证表达式时,请使用该 PackageLicenseExpression 属性。 有关示例,请参阅 许可证表达式示例

    <PropertyGroup>
        <PackageLicenseExpression>MIT</PackageLicenseExpression>
    </PropertyGroup>
    

    若要详细了解 .org 接受 NuGet的许可证表达式和许可证,请参阅 许可证元数据

    打包许可证文件时,使用 PackageLicenseFile 属性指定包路径,相对于包的根目录。 此外,请确保文件包含在包中。 例如:

    <PropertyGroup>
        <PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
    </PropertyGroup>
    <ItemGroup>
        <None Include="licenses\LICENSE.txt" Pack="true" PackagePath=""/>
    </ItemGroup>
    

    有关示例,请参阅 许可证文件示例

    一次只能指定其中一个PackageLicenseExpressionPackageLicenseFilePackageLicenseUrl

    打包没有扩展名的文件

    在某些情况下,例如打包许可证文件时,可能需要包含没有扩展名的文件。 出于历史原因, NuGet&MSBuild 将没有扩展的路径视为目录。

      <PropertyGroup>
        <TargetFrameworks>netstandard2.0</TargetFrameworks>
        <PackageLicenseFile>LICENSE</PackageLicenseFile>
      </PropertyGroup>
      <ItemGroup>
        <None Include="LICENSE" Pack="true" PackagePath=""/>
      </ItemGroup>  
    

    没有扩展示例的文件

    IsTool

    使用 MSBuild -t:pack -p:IsTool=true 时,所有输出文件(如输出程序集方案中所指定)都被复制到 tools 文件夹,而不是 lib 文件夹。 请注意,这不同于 DotNetCliTool,后者通过在 .csproj 文件中设置 PackageType 进行指定。

    使用 .nuspec 文件打包

    尽管建议将通常位于.nuspec项目文件中的所有属性包含在项目文件中,但可以选择使用.nuspec文件打包项目。 对于使用 PackageReference的非 SDK 样式项目,必须导入 NuGet.Build.Tasks.Pack.targets ,以便可以执行包任务。 在打包 nuspec 文件之前,仍需还原项目。 (SDK 样式项目默认包含包目标。)

    项目文件的目标框架无关紧要,打包时 nuspec不使用 。 以下三 MSBuild 个属性与使用 a .nuspec打包相关:

  • NuspecFile:用于打包的 .nuspec 文件的相对或绝对路径。
  • NuspecProperties:键=值对的分号分隔列表。 由于命令行分析的工作方式MSBuild,必须指定多个属性,如下所示: -p:NuspecProperties="key1=value1;key2=value2"
  • NuspecBasePath.nuspec 文件的基路径。
  • 如果使用 dotnet.exe 打包项目,请使用类似于下面的命令:

    dotnet pack <path to .csproj file> -p:NuspecFile=<path to nuspec file> -p:NuspecProperties=<> -p:NuspecBasePath=<Base path> 
    

    如果使用 MSBuild 打包项目,请使用类似于下面的命令:

    msbuild -t:pack <path to .csproj file> -p:NuspecFile=<path to nuspec file> -p:NuspecProperties=<> -p:NuspecBasePath=<Base path> 
    

    请注意, nuspec 使用 dotnet.exe 或 msbuild 打包也会导致默认情况下生成项目。 通过将属性传递给 --no-build dotnet.exe(相当于项目文件中的设置 <NoBuild>true</NoBuild> ),以及项目文件中的设置 <IncludeBuildOutput>false</IncludeBuildOutput> ,可以避免这种情况。

    用于打包nuspec文件的 .csproj 文件的示例为:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <NoBuild>true</NoBuild>
        <IncludeBuildOutput>false</IncludeBuildOutput>
        <NuspecFile>PATH_TO_NUSPEC_FILE</NuspecFile>
        <NuspecProperties>add nuspec properties here</NuspecProperties>
        <NuspecBasePath>optional to provide</NuspecBasePath>
      </PropertyGroup>
    </Project>
    

    用于创建自定义包的高级扩展点

    pack 目标提供两个扩展点,这些扩展点在内部目标框架特定的生成中运行。 扩展点支持,包括目标框架特定的内容和程序集到包中:

  • TargetsForTfmSpecificBuildOutput target: Use for files inside the lib folder or a folder specified using BuildOutputTargetFolder.
  • TargetsForTfmSpecificContentInPackage 目标:用于 . 外部 BuildOutputTargetFolder的文件
  • TargetsForTfmSpecificBuildOutput

    编写自定义目标并将其指定为属性的值 $(TargetsForTfmSpecificBuildOutput) 。 对于默认情况下需要进入 BuildOutputTargetFolder (库的任何文件) ,目标应将这些文件写入 ItemGroup BuildOutputInPackage ,并设置以下两个元数据值:

  • FinalOutputPath:文件的绝对路径;如果未提供,则标识用于评估源路径。
  • TargetPath: (可选) 当文件需要进入其 lib\<TargetFramework> 各自区域性文件夹下的附属程序集等子文件夹时设置。 默认为文件的名称。
  • <PropertyGroup>
      <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);GetMyPackageFiles</TargetsForTfmSpecificBuildOutput>
    </PropertyGroup>
    <Target Name="GetMyPackageFiles">
      <ItemGroup>
        <BuildOutputInPackage Include="$(OutputPath)cs\$(AssemblyName).resources.dll">
            <TargetPath>cs</TargetPath>
        </BuildOutputInPackage>
      </ItemGroup>
    </Target>
    

    TargetsForTfmSpecificContentInPackage

    编写自定义目标并将其指定为属性的值 $(TargetsForTfmSpecificContentInPackage) 。 要使包中包含的任何文件,目标应将这些文件写入 ItemGroup TfmSpecificPackageFile ,并设置以下可选元数据:

  • PackagePath:文件应在包中输出的路径。 NuGet 如果将多个文件添加到同一包路径,则发出警告。
  • BuildAction:要分配给文件的生成操作,仅在包路径位于 contentFiles 文件夹中时才是必需的。 默认值为“None”。
  • <PropertyGroup>
      <TargetsForTfmSpecificContentInPackage>$(TargetsForTfmSpecificContentInPackage);CustomContentTarget</TargetsForTfmSpecificContentInPackage>
    </PropertyGroup>
    <Target Name="CustomContentTarget">
      <ItemGroup>
        <TfmSpecificPackageFile Include="abc.txt">
          <PackagePath>mycontent/$(TargetFramework)</PackagePath>
        </TfmSpecificPackageFile>
        <TfmSpecificPackageFile Include="Extensions/ext.txt" Condition="'$(TargetFramework)' == 'net46'">
          <PackagePath>net46content</PackagePath>
        </TfmSpecificPackageFile>  
      </ItemGroup>
    </Target>  
    

    MSBuild -t:restorenuget restoredotnet restore 与 .NET Core 项目一起使用)会还原项目文件中引用的包,如下所示:

  • 读取所有项目到项目的引用
  • 读取项目属性以查找中间文件夹和目标框架
  • 将数据传递到 MSBuildNuGet.Build.Tasks.dll
  • 编写资产文件、目标和属性
  • 目标 restore 适用于使用 PackageReference 格式的项目。 MSBuild 16.5+此外,还对packages.config格式具有选择加入支持

    不应将restore目标与build目标组合运行

    其他还原设置可能来自 MSBuild 项目文件中的属性。 还可以从命令行使用 -p: 开关设置值(请参阅以下示例)。

    RestoreAdditionalProjectFallbackFoldersExcludes Excludes fallback folders specified in RestoreAdditionalProjectFallbackFolders RestoreTaskAssemblyFile NuGet.Build.Tasks.dll 的路径。 RestoreGraphProjectInput 要还原的以分号分隔的项目列表,其中应包含绝对路径。 RestoreUseSkipNonexistentTargets 通过 MSBuild 它收集项目时,确定是否使用 SkipNonexistentTargets 优化收集项目。 如果未设置,则默认为 true. 当无法导入项目的目标时,后果是一种故障快速行为。 MSBuildProjectExtensionsPath 输出文件夹,默认为BaseIntermediateOutputPathobj文件夹和文件夹。 RestoreForce 在基于 PackageReference 的项目中,强制解析所有依赖项,即使上次还原成功也是如此。 指定此标志类似于删除 project.assets.json 文件。 这不会绕过 http-cache。 RestorePackagesWithLockFile 选择使用锁定文件。 RestoreLockedMode 在锁定模式下运行还原。 这意味着还原不会重新评估依赖项。 NuGetLockFilePath 锁定文件的自定义位置。 默认位置位于项目旁边,并命名 packages.lock.jsonRestoreForceEvaluate 强制还原以重新计算依赖项并更新锁文件,而不发出任何警告。 RestorePackagesConfig 一个选择加入开关,可还原具有packages.config的项目。仅支持 MSBuild -t:restoreRestoreRepositoryPath 仅packages.config。 指定要将包还原到的包目录。 SolutionDirectory 如果未指定,则使用。 RestoreUseStaticGraphEvaluation 选择加入开关,以使用静态图形 MSBuild 评估而不是标准评估。 静态图形评估是一项实验性功能,对于大型存储库和解决方案而言,此功能的速度更快。

    ExcludeRestorePackageImports 属性是一个内部属性,由 NuGet. 不应在任何文件中修改或设置 MSBuild 它。

    msbuild -t:restore -p:RestoreConfigFile=<path>
    

    项目文件:

    <PropertyGroup>
        <RestoreIgnoreFailedSources>true</RestoreIgnoreFailedSources>
    </PropertyGroup>
    

    还原会在生成 obj 文件夹中创建以下文件:

    使用一个 MSBuild 命令还原和生成

    NuGet由于可以还原导致目标和属性下降MSBuild的包,还原和生成评估会使用不同的全局属性运行。 这意味着以下内容将具有不可预知且经常不正确的行为。

    msbuild -t:restore,build
    

    建议的做法是:

    msbuild -t:build -restore
    

    同一逻辑适用于类似于 build其他目标。

    Restoring PackageReference and packages.config projects with MSBuild

    MSBuild 16.5+ 支持msbuild -t:restorepackages.config。

    msbuild -t:restore -p:RestorePackagesConfig=true
    

    packages.config还原仅可用于,而不可用于MSBuild 16.5+dotnet.exe

    使用 MSBuild 静态图形评估还原

    借助 MSBuild 16.6+,添加了一项实验功能, NuGet 用于使用命令行中的静态图形评估,从而显著提高大型存储库的还原时间。

    msbuild -t:restore -p:RestoreUseStaticGraphEvaluation=true
    

    或者,可以通过在 Directory.Build.Props 中设置属性来启用它。

    <Project>
      <PropertyGroup>
        <RestoreUseStaticGraphEvaluation>true</RestoreUseStaticGraphEvaluation>
      </PropertyGroup>
    </Project>
    

    自 2019.x 和 NuGet 5.x Visual Studio起,此功能被视为实验性功能并选择加入。 请遵循 NuGet/Home#9803 了解默认情况下何时启用此功能的详细信息。

    静态图形还原更改还原的 msbuild 部分,项目读取和评估,但不是还原算法! 还原算法在所有NuGet工具中NuGet都是相同的 (.exe、 MSBuild.exe、dotnet.exe和Visual Studio) 。

    在极少数情况下,静态图形还原的行为可能与当前还原不同,某些声明的 PackageReferences 或 ProjectReferences 可能缺失。

    若要在迁移到静态图形还原时一次性检查,请考虑运行:

    msbuild.exe -t:restore -p:RestoreUseStaticGraphEvaluation=true
    msbuild.exe -t:restore
    

    NuGet不应报告任何更改。 如果看到差异,请在 /Home 提交NuGet问题。

    从还原图中替换一个库

    如果还原引入了错误的程序集,可以排除包默认选项,并将其替换为自己的选项。 首先使用顶级 PackageReference,排除所有资产:

    <PackageReference Include="Newtonsoft.Json" Version="9.0.1">
      <ExcludeAssets>All</ExcludeAssets>
    </PackageReference>
    

    接下来,将自己的引用添加到适当的 DLL 本地副本:

    <Reference Include="Newtonsoft.Json.dll" />