将纯内容包导入 Visual Studio 16.6 中的 DotNet Core 3.1 项目

Importing content-only package to DotNet Core 3.1 project in Visual Studio 16.6

我已经定义并创建了一个纯内容包​​来在不同项目之间共享 JSON 架构。我使用 nuget.exe 打包它,并且可以成功地将它添加到 .Net Framework 4.6 库项目中。

但是当我尝试将其添加到 DotNet Core 3.1 库项目(NUnit 测试)时出现以下错误:

NU1212 Invalid project-package combination for <package name>. DotnetToolReference project style can only contain references of the DotnetTool type

Nuget 支持文档 (package type, content files) 没有列出对纯内容包的任何限制(除了“假设它们兼容”之外)。问题是如何创建与 DotNet Core 3.1 库兼容的纯内容 Nuget 包?

我尝试按照 中的建议禁用除本地数据源之外的所有数据源,但这没有任何区别。

这里是.nuspec文件内容

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
    <metadata>
        <id>Package.JsonSchemas</id>
        <version>0.0.1</version>
        <packageTypes>
            <packageType name="Dependency" />
        </packageTypes>
        <authors>me</authors>
        <owners>me</owners>
        <releaseNotes>Fill in later</releaseNotes>
        <description>Set of JSON schemas.</description>
        <tags>json, json-schema, tdv</tags>
        <contentFiles>
            <files include="JsonSchemas\*.json" buildAction="Content" copyToOutput="true" flatten="false" />
        </contentFiles>
    </metadata>

    <files>
        <file src="JsonSchemas\*.*" target="content\JsonSchemas" />
    </files>
</package>

架构示例:

{
  "$schema": "https://json-schema.org/draft/2019-09/schema",

  "$defs": {
    "ArrayItem": {
      "type": "object"
    }
  },

  "title": "dataset object",
  "type": "object",

  "properties": {
    "Data": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/ArrayItem"
      },
      "default": []
    }
  },
  "required": [ "Data" ]
}

NU1212错误确实指向了dotnet tool install,看来不是你的包直接导致的。您确定您通过 NuGet 包管理器或 console 正确添加了您的包吗?它在 .NET Core 3.1 库或 NUnit 项目类型中不可重现。

正如@Perry Qian-MSFT 所建议的,在添加新的 NuGet 包之前,您应该始终确保完全删除旧的 NuGet 包,特别是如果您没有更改 NuSpec 中的包版本。使用旧的缓存包是一个常见问题。要 clear all NuGet package caches 使用以下命令之一。

  • dotnet.exe中使用locals --clear all
  • nuget.exe 中使用 locals -clear all
  • 在 Visual Studio >= 2017 中转到 工具 > NuGet 包管理器 > 包管理器设置 并单击 清除所有 NuGet 缓存

Question is how do I create DotNet Core 3.1 library compatible content-only Nuget package?

具有 PackageReference 的 NuGet 4.0+ 使用 contentFiles,请参阅此 reference

Content files are included in a package using the element, specifying the content folder in the target attribute. However, such files are ignored when the package is installed in a project using PackageReference, which instead uses the element.

您可以继续将文件复制到 content 目录以保持兼容性,但您也必须将它们复制到 contentFiles 目录。您必须确保它们位于 contentFiles\any\any\ 下,否则它们将不会被提取到具有任何目标框架的项目中。

<file src="JsonSchemas\*.*" target="contentFiles\any\any\JsonSchemas" />

下面给出了包内的路径,所以第一个路径段代表代码语言,第二个代表目标框架名字。在 boh 情况下你必须使用 any

/contentFiles/{codeLanguage}/{TxM}

下面是适用于 contentFiles 的示例 NuSpec,它也适用于 .NET Core 3.1。

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
    <metadata>
        <id>Package.JsonSchemas</id>
        <version>0.0.1</version>
        <authors>me</authors>
        <owners>me</owners>
        <releaseNotes>Fill in later</releaseNotes>
        <description>Set of JSON schemas.</description>
        <tags>json, json-schema, tdv</tags>
        <contentFiles>
            <files include="any\any\JsonSchemas\*.json" buildAction="Content" copyToOutput="true" flatten="false" />
        </contentFiles>
    </metadata>
    <files>
        <file src="JsonSchemas\*.*" target="content\JsonSchemas" />
        <file src="JsonSchemas\*.*" target="contentFiles\any\any\JsonSchemas" />
    </files>
</package>

来自您链接的同一个 source,建议不要明确指定依赖类型以实现向后兼容性,因此我将其省略。

Package types are set in the .nuspec file. It's best for backwards compatibility to not explicitly set the Dependency type and to instead rely on NuGet assuming this type when no type is specified.