.NET Core项目的dotnet pack生成带有源的.nupkg文件

时间:2019-01-05 01:06:35

标签: c# .net-core nuget

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

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

但是,我收到此警告:

C:\Program Files\dotnet\sdk\2.1.502\Sdks\NuGet.Build.Tasks.Pack\build\NuGet.Build.Tasks.Pack.targets(202,5): warning NU5100: The assembly 'obj\Release\netcoreapp2.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文件,但是它具有所有源代码(不知道为什么),并且在其他项目中使用时,它们无法引用程序集,因为它们位于{{ 1}}文件夹。

我看过一些从.Net Core项目创建Nuget程序包的指南,但都没有提到与bin\Release\netcoreapp2.1文件夹有关的内容。

我需要了解是否缺少某些东西或做错了什么。

谢谢。

编辑:添加了项目文件和.nuspec文件

项目文件:

lib

<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

1 个答案:

答案 0 :(得分:1)

这里似乎存在一些误解。

首先,lib中的nupkg文件夹不是用于多目标的,而是用于构建中所有的dll。如果您的软件包仅支持1个目标框架标记(TFM),则您的nupkglib下将只有一个文件夹,例如lib/netstandard2.0/MyLib.dll,如果您的软件包可能是lib/netcoreapp2.1/MyLib.dll应用程序使用的API是.NET Core 2.1运行时的一部分,但不是netstandard的。如果您的项目仅使用netstandard的API,那么以netcoreapp为目标毫无益处,并且即使在今天工作正常,也存在潜在的问题,将来可能会引起您的麻烦。

第二,一个简单的类库(对我来说,这意味着项目仅包含.cs文件,没有内容文件,没有构建文件,程序包仅包含dll和NuGet自己的文件)不需要对nupkg内部的内容一无所知。使用SDK样式的项目时,即使多目标的更复杂项目也不需要关心lib文件夹。只需在<TargetFrameworks>元素中指定目标TFM,然后让SDK打包nupkg本身即可。它知道该怎么办。如果您在csproj中进行了任何操作以尝试将输出dll强制移至nupkg中的其他位置,则比改进问题更可能引起问题。

没有看到您的.csproj,我无法猜出您可以怎么做才能将警告消息打包,但是就像我说的那样,全新的dotnet new classlib打包就可以了,如果您的项目仅包含代码文件,在csproj中不需要任何与打包路径相关的内容。