网络框架上的包引用不加载传递依赖项(未在输出中复制)

Package reference on net framework doesn't load transitive dependencies (not copied in output)

从零开始:

  1. 在 net framework 4.7.2 中创建一个 class 库 A
  2. 引用 nuget 包,例如:Newtonsoft
  3. 将 class 库 A 迁移到包引用模式
  4. 为 class 库 A
  5. 生成 nuget 包
  6. 在net framework 4.7.2中创建控制台应用程序B
  7. 参考文献class图书馆A
  8. 将控制台应用程序 B 迁移到包引用模式

我的问题是控制台应用程序 B 的输出中没有复制 Newtonsoft,因此:

如果我在 B 中使用 A 的函数,其签名中有 newtonsoft 对象:编译错误 => 需要在控制台应用程序 B 中引用 Newtonsoft

如果我在 B 中使用 A 的函数,该函数在其主体中使用 newtonsoft 对象:运行时错误 => FileNotFoundException

其实,就是a well-known issuenuget pack 无法将带有 PackageReference 的 net framework Project A 的依赖项添加到 A.1.0.0.nupkg 中。然而,当你使用 nuget pack 用于带有 packages.config 的 net framework 项目时,它可以自动为 nupkg 添加依赖项。

建议在A.nuspec文件下添加依赖

1)通过CMD进入A工程文件夹

2) 然后,运行 nuget specgenerate the A.nuspec file 然后将这些添加到此文件中:

<?xml version="1.0" encoding="utf-8"?>
<package >
  <metadata>
    <id>xxx</id>
    <version>xxx</version>
    <title>xxx</title>
    <authors>xxx</authors>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    ......
    <tags>Tag1 Tag2</tags>
     <dependencies>      
        <dependency id="Newtonsoft.Json" version="12.0.3" />
    </dependencies>
  </metadata>
</package>

3) 然后 运行 nuget pack 生成新的发布版本。另外,当你安装这个包时,请先清理 nuget 缓存(删除 C:\Users\xxx(current user)\.nuget\packages 下的所有文件)

根据 the link in your response Perry Qian-MSFT,我尝试使用 Msbuild pack 而不是 nuget.exe 来打包我的包。

好像有用。

首先需要在生成包中安装nuget包"NuGet.Build.Tasks.Pack"

然后,打包命令:

"C:\Program Files (x86)\Microsoft Visual Studio19\BuildTools\MSBuild\Current\Bin\msbuild.exe" "D:\Your.csproj" -t:Pack -p:Configuration=Release -p:TargetFramework=net472 -p:PackageOutputPath=D:\NugetPackages -p:Authors="xxx" -p:Version="1.0.0.5"

Perry Qian-MSFT > 也许 nuspec 的解决方案有效,但我认为 msbuild pack 的解决方案更好,因为我在更新引用时不需要编辑 nuspec

编辑:

经过一些补充测试,似乎将csproj迁移到“Microsoft.NET.Sdk”形式是另一种解决方案。在这种情况下,我需要使用“dotnet pack”命令:

dotnet pack "D:\Your.csproj" -p:Configuration=Release -p:PackageOutputPath=D:\NugetPackages

不再需要“NuGet.Build.Tasks.Pack”...