首页 > 解决方案 > .NET Core 项目的 dotnet pack 生成带有源的 .nupkg 文件

问题描述

我有一个简单的 .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文件被创建了,但是它有所有的源代码(不知道为什么),当在其他项目中使用时,它们不能引用程序集,因为它们在bin\Release\netcoreapp2.1文件夹中。

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

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

谢谢。

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

项目文件:

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

标签: c#.net-corenuget

解决方案


这里似乎存在一些误解。

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

其次,一个简单的类库(对我来说这意味着项目只包含.cs文件,没有内容文件,没有构建文件,包将只包含 dll 和 NuGet 自己的文件)不需要知道nupkg. lib使用 SDK 样式项目时,多目标的更复杂项目不需要关心文件夹。只需在<TargetFrameworks>元素中指定您的目标 TFM,然后让 SDKnupkg自行打包。它知道该怎么做。如果您csproj尝试将输出 dll 强制到 .dll 中的不同位置nupkg,则更有可能导致问题而不是改进。

没有看到你的.csproj,我无法猜到你可以做些什么来在包上收到警告信息,但就像我说的,一个全新的dotnet new classlib包就可以了,如果你的项目只包含代码文件,你不应该需要任何东西csproj与打包路径有关。


推荐阅读