用于.NET Core项目的dotnet包生成带有源代码的.nupkg文件



我有一个简单的.NET Core 2.1类库项目,需要将其打包为Nuget包。为此,我使用以下命令:

dotnet pack <project>.csproj --output <outputFolder> /p:Configuration=Release

但是,我收到了这个警告:

C:Program Filesdotnetsdk2.1.502SdksNuGet.Build.Tasks.PackbuildNuGet.Build.Tasks.Pack.targets(202,5): warning NU5100: The assembly 'objReleasenetcoreapp2.1<assembly>.dll' is not inside the 'lib' folder and hence it won't be added as a reference when the package is installed into a project. Move it into the 'lib' folder if it needs to be referenced.

我知道lib文件夹是针对多个框架的,但我不希望这样。我只想以.NET Core 2.1为目标。

最后创建了我的.nupkg文件,但它包含了所有的源代码(不知道为什么),在其他项目中使用时,它们不能引用程序集,因为它们位于binReleasenetcoreapp2.1文件夹中。

我看过一些从.Net Core项目创建Nuget包的指南,但没有一本提到与lib文件夹相关的内容。

我需要了解是缺少了什么,还是我做错了什么。

谢谢。

编辑:添加项目文件和.nusspec文件

项目文件:

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<Company>xxx</Company>
<RootNamespace>xxxx</RootNamespace>
<Product>xxxx</Product>
<Authors>xxxx</Authors>
<NuspecFile>xxxxx.nuspec</NuspecFile>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="5.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.1.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3" />
</ItemGroup>
</Project>

.nuspec文件:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>xxxxxx</id>
<version>1.0.0</version>
<title>xxxx</title>
<owners>xxxx</owners>
<description>xxxx</description>
<authors>xxxx.</authors>
<copyright>Copyright 2019 xxxx.</copyright>
<summary>xxx is a common code library for internal projects.</summary>
</metadata>
</package>

这里似乎有一些误解。

首先,nupkg中的lib文件夹不是用于多目标的,而是用于构建中的所有dll。如果您的包只支持1个目标框架名字对象(TFM),那么您的nupkglib下将只有一个文件夹,例如lib/netstandard2.0/MyLib.dll,或者如果您的应用程序使用的API是.NET Core 2.1运行时的一部分,但不是网络标准,则可能是lib/netcoreapp2.1/MyLib.dll。如果你的项目只使用作为netstandard一部分的API,那么以netcoreapp为目标是没有好处的,并且存在潜在的问题,这些问题可能会在未来给你带来问题,即使它现在运行良好。

其次,一个简单的类库(对我来说,这意味着项目只包含.cs文件,没有内容文件,没有构建文件,包只包含dll和NuGet自己的文件)不需要知道nupkg内部的任何内容。即使是多目标的更复杂的项目,在使用SDK风格的项目时也不需要关心lib文件夹。只需在<TargetFrameworks>元素中指定目标TFM,并让SDK打包nupkg本身。它知道该怎么做。如果你在csproj中做了任何事情,试图将输出dll强制到nupkg中的另一个位置,那么这更有可能导致问题,而不是改善情况。

如果没有看到你的.csproj,我猜不出你能做些什么来在包上获得警告消息,但正如我所说,全新的dotnet new classlib包很好,如果你的项目只包含代码文件,你就不需要csproj中与包路径相关的任何内容。

最新更新