在 Visual Studio 16.6 中将仅内容包导入 DotNet Core 3.1 项目

Posted

技术标签:

【中文标题】在 Visual Studio 16.6 中将仅内容包导入 DotNet Core 3.1 项目【英文标题】:Importing content-only package to DotNet Core 3.1 project in Visual Studio 16.6 【发布时间】:2020-11-27 11:13:14 【问题描述】:

我已经定义并创建了一个仅内容包,用于在不同项目之间共享 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 包?

我尝试按照this question 中的建议禁用除本地数据源以外的所有数据源,但这并没有什么不同。

这是.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" ]

【问题讨论】:

请在您的 nuspec 文件中使用它们:&lt;files&gt;&lt;file src="JsonSchemas\*.*" target="content\JsonSchemas" /&gt; &lt;file src="JsonSchemas\*.*" target="contentFiles\any\any" /&gt;&lt;/files&gt; 嗨,关于这个问题的任何更新?如果那个人的回答能帮助你解决问题,请不要忘记标记它:) 嗨@PerryQian-MSFT,我按照你和 thatguy 的建议做了。我什至只是从 thatguy's 的答案中复制并粘贴了 nuspec 定义,但在 Visual Studio(现在是 16.7)中仍然收到相同的错误消息。 另外两个建议:先尝试使用最新的nuget.exe cli v5.6.0打包项目。其次,在你安装新版本的项目之前,你应该确保你的项目已经被移除了——做一个干净的步骤。然后,clean all nuget caches. 是的,谢谢,先清除所有 Nuget 缓存,然后重新安装软件包。 【参考方案1】:

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

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

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

问题是如何创建与 DotNet Core 3.1 库兼容的纯内容 Nuget 包?

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

使用元素将内容文件包含在包中,在目标属性中指定内容文件夹。但是,当使用 PackageReference 将包安装到项目中时,此类文件将被忽略,而使用该元素。

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

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

包中的路径如下所示,因此第一个路径段代表代码语言,第二个路径段代表目标框架名字对象。在两种情况下,您都必须使用 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 中,建议不要显式指定依赖类型以实现向后兼容性,因此我将其省略了。

包类型在 .nuspec 文件中设置。最好不显式设置依赖类型来实现向后兼容性,而是在未指定类型时依赖 NuGet 假设此类型。

【讨论】:

给那些阅读过@thatguy 答案、使用更新示例但仍然遇到同样问题的人的说明。在添加更新包之前尝试clearing Nuget 缓存,如上面建议的“Perry Qian-MSFT”。 @GKalnytskyi 感谢您的评论。我添加了关于清除 NuGet 缓存的部分。

以上是关于在 Visual Studio 16.6 中将仅内容包导入 DotNet Core 3.1 项目的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 中将多行代码格式化为单行

如何在 Visual Studio 2019 中使用 git bash 终端配置文件?

无法在 Visual Studio 中将 Visual C++ 运行时包引用添加到 Windows Phone 项目

在 Visual Studio 2010 中将 Excel 数据导入 DataGridView

如何在 Visual Studio 中将此 SQL 查询转换为 Elasticsearch 查询?

在 Visual Studio 2008 中将 Fxcop 错误显示为编译错误