TL;DR
对于新的 <Project Sdk="Microsoft.NET.Sdk"> .csproj 文件格式,使用 dotnet pack 构建 NuGet 包,即使它们以 .Net Framework 为目标或项目是多目标的。从包含您的.csproj(以及可选的.nuspec)的目录中运行它
dotnet pack MyProject.csproj -c Release
请注意,默认情况下 dotnet pack 将输出 .nupkg 放置在 /bin/Release 文件夹中,这与旧 nuget pack 放置它的当前默认文件夹不同。
我建议您不要为新的.csproj 格式创建明确的.nuspec 文件,因为大多数设置都可以在新项目格式的“包”选项卡中进行设置。但是,如果您确实有.nuspec,那么dotnet pack 还将组合任何与项目名称匹配的.nuspec 文件,从而允许从.csproj 中设置的版本和元数据中替换$ 符号。
更多详情
我也遇到过这个问题 - 在以前的版本中,我通常使用 this approach 来打包 .csproj 与同名的 .nuspec 文件,这样我就可以使用所有 $ 标记,例如$id$,$version$。
但是,当针对较新的 <Project Sdk="Microsoft.NET.Sdk"> csproj 格式尝试此操作时:
nuget pack {MyProject}.csproj -Prop Configuration=Release
我收到了同样的错误(注意bin\release 的“重复”):
错误 NU5012:无法找到 'bin\Release{MyProject}\bin\Release\'。确保项目已构建。
如果我尝试对包含符号的 .nuspec 进行打包(NuGet 版本:4.7.1.5393)
nuget pack {MyProject}.nuspec -Prop Configuration=Release
我只收到了unhelpful message,因为 nuget 无法自动解析 $ 令牌。
值不能为 null 或空字符串。
参数名称:值
但是,通过使用 dotnet pack 而不是 nuget
dotnet pack MyProject.csproj -c Release
我到达了我想去的地方,即一个多目标 NuGet 包,其中 .nuspec 中的 $ 符号与 .csproj 正确同步(您可以通过打开 .nupkg 文件来验证这一点,例如7zip 并检查包根目录中的最终.nuspec 文件)