Прочитать на английском

Поделиться через


Справочник по файлу project.json

Важно!

Это содержимое является устаревшим. Проекты должны использовать формат packages.config или PackageReference.

NuGet 3.x или более поздней версии

В файле project.json содержится список пакетов, используемых в проекте, в формате управления пакетами. Этот формат пришел на смену packages.config, а в NuGet 4.0 и более поздних версиях ему, в свою очередь, пришел на смену формат PackageReference.

Файл project.lock.json (описанный ниже) также применяется в проектах, в которых используется файл project.json.

Файл project.json имеет следующую основную структуру, в которой каждый из четырех объектов верхнего уровня может иметь любое число дочерних объектов:

{
    "dependencies": {
        "PackageID" : "{version_constraint}"
    },
    "frameworks" : {
        "TxM" : {}
    },
    "runtimes" : {
        "RID": {}
    },
    "supports" : {
        "CompatibilityProfile" : {}
    }
}

Зависимости

Содержит список зависимостей пакетов NuGet в проекте в следующей форме:

"PackageID" : "version_constraint"

Например:

"dependencies": {
    "Microsoft.NETCore": "5.0.0",
    "System.Runtime.Serialization.Primitives": "4.0.10"
}

Именно в раздел dependencies добавляются зависимости пакетов в проект из диалогового окна "Диспетчер пакетов NuGet".

Идентификатор пакета соответствует его идентификатору в nuget.org и в консоли диспетчера пакетов: Install-Package Microsoft.NETCore.

При восстановлении пакетов ограничение версии "5.0.0" означает >= 5.0.0. То есть если версия 5.0.0 недоступна на сервере, но версия 5.0.1 имеется, NuGet устанавливает версию 5.0.1 и предупреждает об обновлении. NuGet выбирает самую раннюю доступную версию на сервере, соответствующую ограничению.

Дополнительные сведения о правилах разрешения см. в разделе Разрешение зависимостей.

Управление ресурсами зависимостей

Ресурсы, которые передаются из зависимостей в проект верхнего уровня, определяются с помощью разделенного запятыми набора тегов в свойствах include и exclude ссылки на зависимость. Эти теги перечислены в приведенной ниже таблице.

Тег включения или исключения Затрагиваемые папки пакета
contentFiles Содержимое
среда выполнения Runtime, Resources и FrameworkAssemblies
compile lib
сборка build (свойства и цели MSBuild)
платформы платформы
ничего Нет
all Все папки

Теги в свойстве exclude имеют приоритет перед тегами в свойстве include. Например, include="runtime, compile" exclude="compile" — это тоже самое, что и include="runtime".

Например, чтобы включить папки build и native зависимости, используйте следующие свойства:

{
  "dependencies": {
    "packageA": {
      "version": "1.0.0",
      "include": "build, native"
    }
  }
}

Чтобы исключить папки content и build зависимости, используйте следующие свойства:

{
  "dependencies": {
    "packageA": {
      "version": "1.0.0",
      "exclude": "contentFiles, build"
    }
  }
}

Платформы

Список платформ, на которых выполняется проект, например net45, netcoreapp, netstandard.

"frameworks": {
    "netcore50": {}
    }

В разделе frameworks допускается только одна запись. (Исключение составляют файлы project.json проектов ASP.NET, сборка которых выполняется с помощью нерекомендуемой цепочки инструментов DNX, допускающей несколько целевых платформ.)

Среды выполнения

Содержит список операционных систем и архитектур, в которых выполняется приложение, например win10-arm, win8-x64, win8-x86.

"runtimes": {
    "win10-arm": { },
    "win10-arm-aot": { },
    "win10-x86": { },
    "win10-x86-aot": { },
    "win10-x64": { },
    "win10-x64-aot": { }
}

Пакет, содержащий переносимую библиотеку классов, которая может работать в любой среде выполнения, не требует указания этой среды. Это также должно быть верно в отношении всех зависимостей. В противном случае необходимо указывать среды выполнения.

Поддерживает

Определяет набор проверок для зависимостей пакетов. Вы можете определить, где предполагается выполнение переносимой библиотеки классов или приложения. Определения не являются ограничивающими, то есть код может выполняться и в других средах. Однако если вы указываете эти проверки, NuGet проверяет, все ли зависимости совместимы с перечисленными моникерами целевой версии x. Примеры возможных значений: net46.app, uwp.10.0.app и т. д.

При выборе элемента в диалоговом окне целевых платформ для переносимой библиотеки классов этот раздел должен заполняться автоматически.

"supports": {
    "net46.app": {},
    "uwp.10.0.app": {}
}

Импорт

Раздел Imports предназначен для того, чтобы разрешить пакетам, использующим моникер целевой версии x dotnet, взаимодействовать с пакетами, которые не объявляют моникер целевой версии x dotnet. Если в проекте используется моникер целевой версии x dotnet, все пакеты, от которых вы зависите, должны также содержать моникер целевой версии x dotnet. В противном случае нужно добавить в файл project.json следующий элемент, чтобы обеспечить совместимость платформ, отличных от dotnet, с dotnet:

"frameworks": {
    "dotnet": { "imports" : "portable-net45+win81" }
}

Если вы используете моникер целевой версии x dotnet, система проектов переносимой библиотеки классов добавляет оператор imports, соответствующий поддерживаемым целевым платформам.

Отличия от переносимых приложений и веб-проектов

Содержимое файла project.json, используемого NuGet, представляет собой подмножество данных аналогичного файла в проектах ASP.NET Core. В ASP.NET Core файл project.json содержит метаданные проекта, сведения о компиляции и зависимости. При использовании в других системах проектов эти три типа данных разносятся по отдельным файлам, поэтому файл project.json содержит меньше информации. Ниже представлены наиболее важные отличия.

  • В разделе frameworks может быть только одна платформа.

  • Файл не может содержать зависимости, параметры компиляции и другие данные, которые можно увидеть в файлах project.json DNX. Так как платформа может быть только одна, нет смысла указывать зависимости для конкретных платформ.

  • Компиляция осуществляется платформой MSBuild, поэтому параметры компиляции, определения препроцессора и т. д. содержатся в файле проекта MSBuild, а не в файле project.json.

В NuGet 3 предполагается, что разработчики не редактируют файл project.json вручную, так как для работы с его содержимым предназначен пользовательский интерфейс диспетчера пакетов в Visual Studio. Вы, безусловно, можете редактировать его, однако сборку проекта для запуска восстановления пакетов необходимо выполнять иным способом. См. раздел Восстановление пакета.

project.lock.json

Файл project.lock.json создается в процессе восстановления пакетов NuGet в проектах, в которых применяется файл project.json. Он содержит моментальный снимок всех данных, создаваемых в процессе обхода диспетчером NuGet графа пакетов, включая версию, содержимое и зависимости всех пакетов в проекте. Система сборки использует эти данные для выбора пакетов, которые необходимы при сборке проекта, из глобального расположения вместо обращения к локальной папке пакетов в самом проекте. Благодаря этому ускоряется процесс сборки, так как требуется прочитать только файл project.lock.json вместо нескольких отдельных файлов .nuspec.

Файл project.lock.json создается автоматически при восстановлении пакета, поэтому его можно исключить из системы управления версиями, добавив его в файлы .gitignore и .tfignore (см. раздел Пакеты и система управления версиями). Однако если вы включите его в систему управления версиями, в журнале изменений будут показаны изменения в разрешении зависимостей с течением времени.