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 版本呢?
确保您打包了正确的配置。您可以打包发布配置,同时仅Version在 .csproj 部分中设置与调试配置相关的元素,反之亦然。
使用程序集属性(AssemblyVersion等) - 请注意,它们嵌入在已编译的程序集中,因此要使它们生效,您需要构建项目,并以正确的配置进行操作。通常,您会在“调试”配置中测试代码,然后更改版本并构建而不切换到“发布”,然后打包“发布”配置。
为了避免所有这些问题,最好在打包时始终进行构建,并始终打包显式配置:
nuget pack XYZ.Core.Messaging.csproj -Build -Properties Configuration=Release ...
Run Code Online (Sandbox Code Playgroud)