NuGet打包命令如何生成软件包版本?

5
NuGet版本:4.5.1.4879
当使用“基于项目”的NuGet软件包构建(即将.csproj文件传递给 nuget pack 命令)时,我认为我了解NuGet如何确定在生成的软件包中使用的版本。具体来说,如果在AssemblyInfo中存在 AssemblyInformationalVersion ,则它将使用它,或者如果不存在 AssemblyInformationalVersion ,则使用 AssemblyVersion
在我的某些程序集中,这似乎按预期工作(我有一个简单的一对一关系,即程序集和包之间的关系 - 1个程序集产生同名的1个包),但在其他程序集中却没有。
在一个有问题的程序集中,AssemblyInfo包括以下内容:
[assembly: AssemblyVersion("2.0.0.0")]
[assembly: AssemblyFileVersion("2.0.0.0")]
[assembly: AssemblyInformationalVersion("2.0.0")]

在.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>

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

尽管设置了这些内容,但当我尝试构建包时,使用此命令:

nuget pack XYZ.Core.Messaging.csproj  -OutputDirectory "c:\build\nuget-local" -Suffix "local"

它将包构建为XYZ.Core.Messaging.1.0.0-local.nupkg。对于我使用类似命令(只是不同的.csproj文件)构建的其他一些包,具有相同的AssemblyInfo内容,它们可以正确地构建版本2.0.0的包。那么NuGet从哪里获取1.0.0版本呢?

请查看此可能的重复问题: https://dev59.com/B3VD5IYBdhLWcg3wKoWH - RBreuer
1
@RBreuer 绝对不是重复的。那个信息已经被理解了,但正如我上面写的,我正在使用AssemblyInformationalVersion - 问题是nuget正在忽略它。 - E-Riz
nuspec文件中的<metadata>内的<version>是否已正确更新? - RBreuer
@RBreuer 不是的。我刚刚双重检查了一下,解压了.nupkg文件并检查了它的.nuspec文件:<version>1.0.0-local</version> - E-Riz
1
确保您打包正确的配置。例如,在您的csproj中,版本设置为Debug配置,因此如果您打包Release - 那将没有任何效果。同样适用于程序集属性。如果在更改它们后,您从未手动构建过发布配置的项目 - nuget pack将无法看到它们(如果您正在打包发布版)。因此,为了确保,请使用-Build运行nuget pack,并明确指定配置。 - Evk
@Evk,你说对了。如果不指定配置,NuGet 就会拉取 Debug 版本。请将您的评论转换为答案,以便我可以接受它。 - E-Riz
1个回答

4

确保打包正确的配置。你可能会打包Release配置,但只在与Debug配置相关的.csproj部分中设置Version元素,反之亦然。

使用程序集属性(AssemblyVersion等)-请注意,它们被嵌入到编译的程序集中,因此要生效,需要在正确的配置下构建项目。通常情况下,您在Debug配置下测试代码,然后更改版本并在没有切换到Release的情况下构建,最终打包Release配置。

为了避免所有这些问题,建议始终在打包时进行构建,并始终打包明确的配置:

nuget pack XYZ.Core.Messaging.csproj  -Build -Properties Configuration=Release ...

经过多次尝试,这个解决方案终于对我起作用了。我的 postbuild 事件现在看起来像 nuget pack MyProject.csproj -Properties Configuration=Release -IncludeReferencedProjects,它最终总是构建正确版本的项目和引用的项目。 - Joep Geevers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接