Импорт пакета только для содержимого в проект DotNet Core 3.1 в 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 (тип пакета, файлы содержимого) не содержит никаких ограничений ( помимо предположения, что они совместимы) в пакетах только для содержимого. Вопрос в том, как создать пакет Nuget, совместимый только с содержимым библиотеки DotNet Core 3.1?

Я попытался отключить все источники данных, кроме локального, как было предложено в этом вопросе, но это не имело никакого значения.

Вот содержимое .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" ]
}

person GKalnytskyi    schedule 07.08.2020    source источник
comment
Используйте их в своем файле NUSPEC: <files><file src="JsonSchemas\*.*" target="content\JsonSchemas" /> <file src="JsonSchemas\*.*" target="contentFiles\any\any" /></files>   -  person Mr Qian    schedule 07.08.2020
comment
Привет, есть новости об этой проблеме? Если ответ этого парня поможет вам разобраться с проблемой, не забудьте отметить это :)   -  person Mr Qian    schedule 10.08.2020
comment
Привет, @ PerryQian-MSFT, я сделал, как вы и thatguy рекомендовали. Я даже просто скопировал и вставил определение nuspec из ответа thatguy, и я все еще получаю то же сообщение об ошибке в Visual Studio (теперь 16.7).   -  person GKalnytskyi    schedule 10.08.2020
comment
Еще два предложения: сначала попробуйте использовать последнюю версию nuget.exe cli v5.6.0 для упаковки проекта. Во-вторых, перед установкой новой версии проекта вы должны убедиться, что ваш проект уже удален - выполните чистый шаг. Затем очистить все кеши nuget.   -  person Mr Qian    schedule 10.08.2020
comment
Да, спасибо, сначала очистка всех кешей Nuget, а затем переустановка пакета помогла.   -  person GKalnytskyi    schedule 10.08.2020


Ответы (1)


Ошибка NU1212 указывает на dotnet tool install, похоже, она не вызвана непосредственно вашим пакетом. Вы уверены, что правильно добавляете пакет через диспетчер пакетов NuGet или console? Он не воспроизводится в библиотеке .NET Core 3.1 или типе проекта NUnit.

Как предлагает @Perry Qian-MSFT, вы всегда должны убедиться, что старый пакет NuGet полностью удален, прежде чем добавлять новый, особенно если вы не меняли версию пакета в NuSpec. Вместо этого используется старый кешированный пакет - распространенная проблема. В очистить все кеши пакетов NuGet, используя одну из следующих команд.

  • В dotnet.exe используйте locals --clear all
  • В nuget.exe используйте locals -clear all
  • В Visual Studio ›= 2017 перейдите в ИнструментыДиспетчер пакетов NuGetПараметры диспетчера пакетов и нажмите Очистить все кеши NuGet.

Вопрос в том, как создать пакет Nuget, совместимый только с содержимым библиотеки DotNet Core 3.1?

NuGet 4.0+ с PackageReference использует contentFiles, см. справочник < / а>.

Файлы содержимого включаются в пакет с помощью элемента, указывающего папку содержимого в целевом атрибуте. Однако такие файлы игнорируются, если пакет устанавливается в проекте с помощью PackageReference, который вместо этого использует элемент.

Вы можете продолжать копировать файлы в каталог content для совместимости, но вы также должны скопировать их в каталог contentFiles. Вы должны убедиться, что они находятся в contentFiles\any\any\, иначе они не будут извлечены в проекты с какой-либо целевой структурой.

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

Путь в пакете указан ниже, поэтому первый сегмент пути представляет язык кода, а второй - прозвище целевой платформы. Вы должны использовать any в случаях boh.

/contentFiles/{codeLanguage}/{TxM}

Ниже представлен ваш пример NuSpec, адаптированный к contentFiles, который также будет работать в .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>

Из того же источника, на который вы указали ссылку, рекомендуется не указывать тип зависимости явно для обратной совместимости, поэтому я не стал его указывать.

Типы пакетов задаются в файле .nuspec. Для обеспечения обратной совместимости лучше всего не устанавливать явно тип зависимости и вместо этого полагаться на NuGet, предполагающий этот тип, когда тип не указан.

person thatguy    schedule 07.08.2020
comment
Заметка для людей, которые прочитали ответ @thatguy, использовали обновленный пример и по-прежнему столкнулись с той же проблемой. Попробуйте очистить кеши Nuget перед добавлением обновленного пакета, как было предложено выше Perry Qian-MSFT. - person GKalnytskyi; 10.08.2020
comment
@GKalnytskyi Спасибо за ваш комментарий. Я добавил раздел об очистке кешей NuGet. - person thatguy; 10.08.2020