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

时间:2019-08-27 03:05:52

标签: c# nuget nuget-spec

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

<GeneratePackageOnBuild>true</GeneratePackageOnBuild>

这将导致生成的程序包包含所有已标记为“复制到输出目录=不复制”的嵌入式资源文件。

enter image description here

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

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

然后我遇到了一个新问题。通过使用NUGET.EXE而不是visual studio,生成的程序包将依赖项部分显示为“不受支持”,这是通过在“ NuGet Explorer”中打开程序包看到的:

enter image description here

以下是用于创建程序包的.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>

是否可以解决“不受支持”的目标?我也尝试使用“ netstandard2.0”和其他标识符,但仍然得到相同的“不受支持”。

或者,有没有一种方法可以使用Visual Studio的自动包生成功能,并防止它在包中包含文件?

1 个答案:

答案 0 :(得分:1)

如您所见,当您使用nuspec时,您有责任使每件事变得正确。使用NuGet的MSBuild包目标更加容易,因为它可以自动执行创建依赖项之类的工作,包括在组中使用正确的TFM。

NuGet在pack targets上的文档具有与msbuild打包相关的内容(使用dotnet packGeneratePackageOnBuild时会发生这种情况)。尤其是Including content in a package的部分具有以下示例:

<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的注释:为您建立构建包很方便,但这意味着,当您进行调试并且需要更改一行代码然后再次进行测试时,您不仅要等待构建,而且还可以打包。如果您的程序包很小,则可能会很快,但仍然会减慢您的“内环”体验。大多数开发人员只需要打包次数就比其生成的次数少得多,因此我建议禁用GeneratePackageOnBuild,而在您实际需要nupkg时在项目(或解决方案)上运行dotnet pack