网络框架上的包引用不加载传递依赖项(未在输出中复制)
Package reference on net framework doesn't load transitive dependencies (not copied in output)
从零开始:
- 在 net framework 4.7.2 中创建一个 class 库 A
- 引用 nuget 包,例如:Newtonsoft
- 将 class 库 A 迁移到包引用模式
- 为 class 库 A
生成 nuget 包
- 在net framework 4.7.2中创建控制台应用程序B
- 参考文献class图书馆A
- 将控制台应用程序 B 迁移到包引用模式
我的问题是控制台应用程序 B 的输出中没有复制 Newtonsoft,因此:
如果我在 B 中使用 A 的函数,其签名中有 newtonsoft 对象:编译错误 => 需要在控制台应用程序 B 中引用 Newtonsoft
如果我在 B 中使用 A 的函数,该函数在其主体中使用 newtonsoft 对象:运行时错误 => FileNotFoundException
其实,就是a well-known issue。 nuget 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 spec
到 generate 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”...
从零开始:
- 在 net framework 4.7.2 中创建一个 class 库 A
- 引用 nuget 包,例如:Newtonsoft
- 将 class 库 A 迁移到包引用模式
- 为 class 库 A 生成 nuget 包
- 在net framework 4.7.2中创建控制台应用程序B
- 参考文献class图书馆A
- 将控制台应用程序 B 迁移到包引用模式
我的问题是控制台应用程序 B 的输出中没有复制 Newtonsoft,因此:
如果我在 B 中使用 A 的函数,其签名中有 newtonsoft 对象:编译错误 => 需要在控制台应用程序 B 中引用 Newtonsoft
如果我在 B 中使用 A 的函数,该函数在其主体中使用 newtonsoft 对象:运行时错误 => FileNotFoundException
其实,就是a well-known issue。 nuget 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 spec
到 generate 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”...