NuGet pack命令如何生成包版本?

E-R*_*Riz 5 c# nuget nuget-package

NuGet版本:4.5.1.4879

当使用“项目驱动”NuGet 包构建(即,将 .csproj 文件传递​​给命令nuget pack)时,我想我理解 NuGet 将如何确定在生成的包中使用的版本。AssemblyInformationalVersion具体来说,如果 AssemblyInfo 中存在或不存在,AssemblyVersion则将使用它AssemblyInformationalVersion

这似乎在我的一些程序集中按预期工作(我在程序集和包之间有一个简单的 1:1 关系 - 1 个程序集生成 1 个同名的包),但在其他程序集中则不然。

在有问题的程序集中,AssemblyInfo 包含以下内容:

[assembly: AssemblyVersion("2.0.0.0")]
[assembly: AssemblyFileVersion("2.0.0.0")]
[assembly: AssemblyInformationalVersion("2.0.0")]
Run Code Online (Sandbox Code Playgroud)

在 .csproj 文件中,我还有这个以及其他内容(注意标签<Version>):

  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{E233E8E2-EB9E-461F-80C2-63F9AFCC425D}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>XYZ.Core.Messaging</RootNamespace>
    <AssemblyName>XYZ.Core.Messaging</AssemblyName>
    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>

    <Version>2.0.0</Version>

    <NuGetPackageImportStamp>
    </NuGetPackageImportStamp>
    <TargetFrameworkProfile />
  </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我没有 .nuspec 文件。

尽管有这些设置,当我尝试使用以下命令构建包时:

nuget pack XYZ.Core.Messaging.csproj  -OutputDirectory "c:\build\nuget-local" -Suffix "local"
Run Code Online (Sandbox Code Playgroud)

它将包构建为XYZ.Core.Messaging.1.0.0-local.nupkg.

对于我使用类似命令(只是不同的 .csproj 文件)构建的其他一些包,具有相同的 AssemblyInfo 内容,这些包可以正确构建版本 2.0.0 的包。

那么 NuGet 从哪里可以获得 1.0.0 版本呢?

Evk*_*Evk 4

确保您打包了正确的配置。您可以打包发布配置,同时仅Version在 .csproj 部分中设置与调试配置相关的元素,反之亦然。

使用程序集属性(AssemblyVersion等) - 请注意,它们嵌入在已编译的程序集中,因此要使它们生效,您需要构建项目,并以正确的配置进行操作。通常,您会在“调试”配置中测试代码,然后更改版本并构建而不切换到“发布”,然后打包“发布”配置。

为了避免所有这些问题,最好在打包时始终进行构建,并始终打包显式配置:

nuget pack XYZ.Core.Messaging.csproj  -Build -Properties Configuration=Release ...
Run Code Online (Sandbox Code Playgroud)