在 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 文件中使用它们:<files><file src="JsonSchemas\*.*" target="content\JsonSchemas" /> <file src="JsonSchemas\*.*" target="contentFiles\any\any" /></files>
嗨,关于这个问题的任何更新?如果那个人的回答能帮助你解决问题,请不要忘记标记它:)
嗨@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 all
在nuget.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 2019 中使用 git bash 终端配置文件?
无法在 Visual Studio 中将 Visual C++ 运行时包引用添加到 Windows Phone 项目
在 Visual Studio 2010 中将 Excel 数据导入 DataGridView