Импорт пакета только для содержимого в проект Do tNet Core 3.1 в Visual Studio 16.6 - PullRequest
0 голосов
/ 07 августа 2020

Я определил и создал пакет только для содержимого для обмена схемами JSON между различными проектами. Я упаковал его, используя nuget.exe, и смог успешно добавить его в. Net проект библиотеки Framework 4.6.

Но когда я попытался добавить его в проект библиотеки Do tNet 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, совместимый с библиотекой Do tNet 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" ]
}

1 Ответ

2 голосов
/ 07 августа 2020

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

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

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

Вопрос в том, как создать пакет NuGet, совместимый с библиотекой Do tNet 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}

Ниже представлен ваш пример NuSpe c, адаптированный к 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>

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

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

...