Nuget程序包创建不包括引用的dll

时间:2019-05-24 15:27:54

标签: .net-core nuget nuget-package packagereference

我正在使用Visual Studio 2019社区版本和程序包管理器控制台。我正在使用.net core 2.2,并且启用了包引用。我希望能够创建一个单个的nuget包coreproj1,其中还将包括Coreproj2和coreProj3的dll,而不必打包CoreProj2和CoreProj3,因为有很多项目,并且打包它们都是不可行的。我在网上看过,找不到清晰的解决方案,因为其中很多人都使用软件包参考

  CoreProj1 references CoreProj2 and CoreProj3 
  CoreProj2 and CoreProj3 do not reference anything

我当前正在使用

   dotnet pack "full project path" --output "outputPath" 

当我尝试安装软件包时,出现以下错误(CoreProj3出现相同的错误)

  Error NU1101  Unable to find package CoreProj2. No packages exist with this id in source(s): LocalPackages, Microsoft Visual Studio Offline Packages, nuget.org,  TestNuget   source\repos\TestNuget\TestNuget\TestNuget.csproj   1

2 个答案:

答案 0 :(得分:3)

这是再现:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <PackageId>CoreProj1</PackageId>
    <Description>CoreProj1</Description>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\CoreProj2\CoreProj2.csproj" />
    <ProjectReference Include="..\CoreProj3\CoreProj3.csproj" />
  </ItemGroup>
</Project>

然后Proj2和3具有相同的内容:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <IsPackable>false</IsPackable>
  </PropertyGroup>
</Project>

在第一个运行dotnet pack的结果中,一个程序包没有两个引用项目的程序集。

解决方法是安装NuGetizer(免责声明:这是Xamarin / Microsoft最初由我自己创建的项目,然后被放弃,直到我分叉并获得所有权):

<ItemGroup>
  <PackageReference Include="NuGetizer" Version="0.5.0" />
</ItemGroup>

在安装并再次运行dotnet pack之后,将正确打包所有三个项目。此外,您还可以安装dotnet全局工具nugetize,以便非常快速地检查要打包的内容,而不会花费构建时间:

dotnet tool install -g dotnet-nugetize

然后只需从项目文件夹运行nugetize

❯ nugetize
Package: CoreProj1.1.0.0.nupkg
        C:\Temp\corepack\CoreProj1\bin\CoreProj1.nuspec
    Authors    : CoreProj1
    Description: CoreProj1
    Version    : 1.0.0
Contents:
    /lib/
    net5.0/
        CoreProj1.dll
        CoreProj1.pdb
        CoreProj2.dll
        CoreProj2.pdb
        CoreProj3.dll
        CoreProj3.pdb

在控制台中使用细微的颜色使其更美观:

enter image description here

答案 1 :(得分:1)

包括使用MSBuild包目标的引用项目程序集(dotnet pack实际上只是dotnet msbuld -t:pack的别名)is not supportednuget.exe pack的参数IncludeReferencedProjects可以满足您的要求,但不适用于使用PackageReference或SDK样式的项目(始终为PackageReference)的项目。

一个可能的解决方法是拥有一个构建脚本,该脚本首先构建所有项目,然后将所有程序集复制到nuget程序包布局中,然后使用nuget.exe pack打包该目录布局。

另一种解决方法是让nuspec带有一堆<file src="..." target="lib\<tfm>\">元素,它们告诉NuGet从其编译位置打包所有程序集。

另一种解决方法是使用MSBuild扩展性来告知NuGet的MSBuils目标有关要在构建之后但在打包之前打包的程序集的信息。上面链接的线程中有一些注释,提供了可能的示例。