Краткий обзор изменений в средствах .NET CoreHigh-level overview of changes in the .NET Core tools

В этом документе описываются изменения, связанные с переходом от использования project.json к MSBuild и системе проектов csproj, а также содержатся сведения об изменении расположения средств .NET Core и реализации команд интерфейса командной строки.This document describes the changes associated with moving from project.json to MSBuild and the csproj project system with information on the changes to the layering of the .NET Core tooling and the implementation of the CLI commands. Эти изменения появились в выпуске SDK для .NET Core версии 1.0 и Visual Studio 2017, который увидел свет 7 марта 2017 г. (см. объявление), но изначально были реализованы в выпуске предварительной версии 3 пакета SDK для .NET Core.These changes occurred with the release of .NET Core SDK 1.0 and Visual Studio 2017 on March 7, 2017 (see the announcement) but were initially implemented with the release of the .NET Core SDK Preview 3.

Переход с использования project.jsonMoving away from project.json

Самое значительное изменение в средствах .NET Core — переход от project.json к CSPROJ-файлу в качестве системы проектов.The biggest change in the tooling for .NET Core is certainly the move away from project.json to csproj as the project system. Последние версии средств командной строки не поддерживают файлы project.json.The latest versions of the command-line tools don't support project.json files. Это означает, что эти средства нельзя использовать для сборки, выполнения или публикации приложений и библиотек на основе project.json.That means that it cannot be used to build, run or publish project.json based applications and libraries. Чтобы использовать эту версию средств, необходимо переместить имеющиеся проекты или создать новые.In order to use this version of the tools, you will need to migrate your existing projects or start new ones.

В рамках этого перемещения настраиваемый обработчик сборки, разработанная для сборки проектов project.json, заменена на полнофункциональный модуль MSBuild.As part of this move, the custom build engine that was developed to build project.json projects was replaced with a mature and fully capable build engine called MSBuild. Это хорошо известный модуль в сообществе .NET, так как это основная технология с момента первого выпуска платформы.MSBuild is a well-known engine in the .NET community, since it has been a key technology since the platform's first release. Чтобы этот модуль можно было использовать для сборки приложений .NET Core, MSBuild был перенесен на .NET Core, и теперь его можно использовать на любой платформе, где работает .NET Core.Of course, because it needs to build .NET Core applications, MSBuild has been ported to .NET Core and can be used on any platform that .NET Core runs on. Мы стремимся превратить .NET Core в кроссплатформенную среду разработки. Этот переход никак не повлияет на работу в этом направлении.One of the main promises of .NET Core is that of a cross-platform development stack, and we have made sure that this move does not break that promise.

Примечание

Если вы только начинаете использовать MSBuild, советуем сначала ознакомиться со статьей Основные возможности MSBuild.If you are new to MSBuild and would like to learn more about it, you can start by reading the MSBuild Concepts article.

Многоуровневая архитектура средствThe tooling layers

В связи с переходом на другую систему проектов и заменой модуля сборки возникает естественный вопрос — повлияют ли какие-либо из этих изменений на общую архитектуру всей экосистемы средств .NET Core?With the move away from the existing project system as well as with building engine switches, the question that naturally follows is do any of these changes change the overall "layering" of the whole .NET Core tooling ecosystem? Появились ли новые двоичные файлы и компоненты?Are there new bits and components?

Сначала рассмотрим схему размещения средств по уровням в предварительной версии 2.Let's start with a quick refresher on Preview 2 layering as shown in the following picture:

Высокоуровневая архитектура средств предварительной версии 2

Расположение средств довольно простое.The layering of the tools is quite simple. Внизу как основа расположены средства командной строки .NET Core.At the bottom we have the .NET Core Command Line tools as a foundation. Все другие средства более высокого уровня, например Visual Studio и Visual Studio Code, зависят от интерфейса командной строки для выполнения таких операций, как сборка проектов, восстановление зависимостей и т. д.All other, higher-level tools such as Visual Studio or Visual Studio Code, depend and rely on the CLI to build projects, restore dependencies and so on. Это означает, что, к примеру, для выполнения операции восстановления в Visual Studio требовалось вызвать команду dotnet restore (см. примечание) в интерфейсе командной строки.This meant that, for example, if Visual Studio wanted to perform a restore operation, it would call into dotnet restore (see note) command in the CLI.

В связи с переходом на новую систему проектов предыдущая схема изменилась.With the move to the new project system, the previous diagram changes:

Высокоуровневая архитектура пакета SDK для .NET Core 1.0.0

Основное различие заключается в том, что интерфейс командной строки больше не является основным уровнем. Теперь эту роль выполняет общий компонент SDK.The main difference is that the CLI is not the foundational layer anymore; this role is now filled by the "shared SDK component". Это — набор целевых объектов и связанных задач, которые отвечают за компиляцию и публикацию кода, а также за его упаковку в пакеты NuGet и т. д. Сам пакет SDK с открытым исходным кодом доступен на сайте GitHub в репозитории SDK.This shared SDK component is a set of targets and associated tasks that are responsible for compiling your code, publishing it, packing NuGet packages etc. The SDK itself is open-source and is available on GitHub on the SDK repo.

Примечание

Целевой объект — это термин MSBuild, обозначающий именованную операцию, которую может вызвать MSBuild.A "target" is a MSBuild term that indicates a named operation that MSBuild can invoke. Обычно она связана с одной или несколькими задачами, выполняющими определенную логику, которую должен реализовать целевой объект.It is usually coupled with one or more tasks that execute some logic that the target is supposed to do. MSBuild поддерживает множество готовых целевых объектов, таких как Copy или Execute. Благодаря этому пользователи могут создавать собственные задачи с помощью управляемого кода и определять целевые объекты для их выполнения.MSBuild supports many ready-made targets such as Copy or Execute; it also allows users to write their own tasks using managed code and define targets to execute those tasks. Дополнительную информацию см. в статье Задачи MSBuild.For more information, see MSBuild tasks.

Все наборы инструментов теперь используют общий компонент SDK и его целевые объекты, в том числе интерфейс командной строки.All the toolsets now consume the shared SDK component and its targets, CLI included. Например, в следующей версии для восстановления зависимостей для проектов .NET Core Visual Studio не будет вызывать команду dotnet restore (см. примечание). Вместо этого будет напрямую использоваться операция восстановления.For example, the next version of Visual Studio will not call into dotnet restore (see note) command to restore dependencies for .NET Core projects, it will use the "Restore" target directly. Так как это целевые объекты MSBuild, их можно выполнить с помощью команды dotnet msbuild в самом модуле MSBuild.Since these are MSBuild targets, you can also use raw MSBuild to execute them using the dotnet msbuild command.

Команды CLICLI commands

Введение общего компонента SDK означает, что большинство существующих команд интерфейса командной строки были заново реализованы как целевые объекты и задачи MSBuild.The shared SDK component means that the majority of existing CLI commands have been re-implemented as MSBuild tasks and targets. Как это повлияло на команды интерфейса командной строки и использование набора инструментов?What does this mean for the CLI commands and your usage of the toolset?

Это не влияет на использование интерфейса командной строки.From an usage perspective, it doesn't change the way you use the CLI. Он по-прежнему содержит основные команды, существующие в предварительной версии 2:The CLI still has the core commands that exist in Preview 2 release:

  • new
  • restore
  • run
  • build
  • publish
  • test
  • pack

Эти команды по-прежнему выполняют ожидаемые функции (создание, сборка, публикация, упаковка проекта и т. д.).These commands still do what you expect them to do (new up a project, build it, publish it, pack it and so on). Большинство параметров не изменились и по-прежнему существуют. Чтобы ознакомиться с изменениями, обратитесь к тексту справки по командам (при помощи dotnet <command> --help) или документации на этом сайте.Majority of the options are not changed, and are still there, and you can consult either the commands' help screens (using dotnet <command> --help) or documentation on this site to get familiar with any changes.

Команды интерфейса командной строки с точки зрения выполнения принимают параметры и отправляют вызов к самому модулю MSBuild, который задает необходимые свойства и запускает нужный целевой объект.From an execution perspective, the CLI commands will take their parameters and construct a call to "raw" MSBuild that will set the needed properties and run the desired target. Чтобы лучше проиллюстрировать это, рассмотрим следующую команду:To better illustrate this, consider the following command:

dotnet publish -o pub -c Release

Эта команда публикует приложение в папку pub с помощью конфигурации Release.This command is publishing an application into a pub folder using the "Release" configuration. На внутреннем уровне эта команда преобразовывается в следующий вызов MSBuild:Internally, this command gets translated into the following MSBuild invocation:

dotnet msbuild -t:Publish -p:OutputPath=pub -p:Configuration=Release

Важным исключением из этого правила являются команды new и run, так как они были реализованы в качестве целевых объектов MSBuild.The notable exception to this rule are new and run commands, as they have not been implemented as MSBuild targets.

Примечание

Начиная с пакета SDK для .NET Core 2.0 нет необходимости выполнять команду dotnet restore, так как она выполняется неявно всеми командами, которые требуют восстановления, например dotnet new, dotnet build и dotnet run.Starting with .NET Core 2.0 SDK, you don't have to run dotnet restore because it's run implicitly by all commands that require a restore to occur, such as dotnet new, dotnet build and dotnet run. Эту команду по-прежнему можно использовать в некоторых сценариях, где необходимо явное восстановление, например в сборках с использованием непрерывной интеграции в Azure DevOps Services или системах сборки, где требуется явно контролировать время восстановления.It's still a valid command in certain scenarios where doing an explicit restore makes sense, such as continuous integration builds in Azure DevOps Services or in build systems that need to explicitly control the time at which the restore occurs.