nuget.exe 无法识别 nuspec 文件中的任何目标框架

nuget.exe doesn't recognize any target framework in nuspec file

我有一个直接在 visual studio 中生成 NuGet 包的项目,通过在 CSPROJ 文件中设置以下选项:

<GeneratePackageOnBuild>true</GeneratePackageOnBuild>

这会导致生成的包包含所有已标记为 "copy to output directory=Do not copy" 的嵌入资源文件。

遗憾的是,Visual Studio 的自动打包程序选择始终将这些文件复制到 NuGet 包中,而不管。

为了解决这个问题,我一直在研究编辑 .NUSPEC 文件并从命令行使用 NUGET.EXE 来创建包。

那我运行又进入了一个新的问题。通过使用 NUGET.EXE 而不是 visual studio,生成的包将依赖项部分显示为 "unsupported",我通过在 'NuGet Explorer':

中打开包来看到它

这是创建程序包的 .bat 文件:

c:\nuget\nuget.exe config -Set repositoryPath="%USERPROFILE%\.nuget\packages"
c:\nuget\nuget.exe pack -IncludeReferencedProjects -properties Configuration=Release

这是 NUSPEC 文件:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
  <metadata>
    <id>Integrative.Lara</id>
    <version>0.5.3</version>
    <authors>Pablo Carbonell, Integrative Software LLC</authors>
    <owners>Pablo Carbonell, Integrative Software LLC</owners>
    <requireLicenseAcceptance>true</requireLicenseAcceptance>
    <license type="file">LICENSE</license>
    <projectUrl>https://github.com/integrativesoft/lara</projectUrl>
    <iconUrl>https://integrative.b-cdn.net/Integrative.ico</iconUrl>
    <description>Lara is ...</description>
    <copyright>Copyright (c) 2019 Integrative Software LLC</copyright>
    <tags>lara, web, html, html5, desktop, gui, cross, framework, mac, osx, platform, ui, blazor, razor</tags>
    <repository url="https://github.com/integrativesoft/lara" />
    <dependencies>
      <group targetFramework=".NETStandard2.0">
        <dependency id="Microsoft.AspNetCore" version="2.2.0" exclude="Build,Analyzers" />
        <dependency id="Microsoft.AspNetCore.WebSockets" version="2.2.1" exclude="Build,Analyzers" />
      </group>
    </dependencies>
  </metadata>
</package>

有没有办法修复 "unsupported" 目标?我也尝试使用 "netstandard2.0" 和其他标识符,但仍然得到相同的 "unsupported".

或者,有没有办法使用 Visual Studio 的自动包生成并防止它在包中包含文件?

如您所见,当您使用 nuspec 时,您有责任确保每一件小事都正确无误。使用 NuGet 的 MSBuild 包目标更容易,因为它会自动执行诸如创建依赖项之类的操作,包括在组中使用正确的 TFM。

pack targets has stuff relevant to packing with msbuild (which is what happens when you use dotnet pack or GeneratePackageOnBuild). In particular the section on Including content in a package 上的 NuGet 文档有这个示例:

<Content Include="..\win7-x64\libuv.txt">
 <Pack>false</Pack>
</Content>

由于您的文件是嵌入的,因此您的 csproj 将包含类似 <EmbeddedResource Include="whatever.ext" /> 的内容。因此,使用文档中的信息,您可以执行 <EmbeddedResource Include="whatever.ext" Pack="false" />,或者像文档那样使用多行版本。 MSBuild 允许您以任何一种方式设置项目元数据。

<GeneratePackageOnBuild>true</GeneratePackageOnBuild>

关于 GeneratePackageOnBuild 的注意事项:让 build 为您创建包很方便,但这意味着当您在调试时需要更改一行代码才能再次测试,您不仅要等待构建,也用于打包。如果您的包裹很小,它可能相当快,但它仍然会减慢您的 "inner-loop" 体验。大多数开发人员只需要打包的频率远低于他们构建的频率,因此我建议在您实际需要 nupkg 时禁用 GeneratePackageOnBuild,而是在项目(或解决方案)上禁用 运行 dotnet pack