Развертывание приложений .NET Core с помощью Visual Studio

Приложение .NET Core можно развернуть как развертывание, зависящее от платформы, которое содержит двоичные файлы приложений, но зависит от наличия .NET Core в целевой системе, или как автономное развертывание, которое содержит и приложение, и двоичные файлы .NET Core. Общие сведения о развертывании приложений .NET Core см. в разделе Развертывание приложений .NET Core.

В разделах ниже содержатся сведения об использовании Microsoft Visual Studio для создания следующих типов развертывания:

  • Развертывание, зависящее от платформы
  • развертывание, зависящее от платформы, с зависимостями сторонних разработчиков;
  • Автономное развертывание
  • Автономное развертывание с зависимостями сторонних разработчиков

Сведения об использовании Visual Studio для разработки приложений .NET Core см. в статье Зависимости и требования для .NET Core.

Развертывание, зависящее от платформы

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

  1. Создание проекта.

    Выберите File>New>Project ( Файл > Создать > Проект). В диалоговом окне Создать проект разверните категории проекта своего языка (C# или Visual Basic) на панели типов проектов Установлено, выберите .NET Core, а затем выберите шаблон Консольное приложение (.NET Core) на центральной панели. В поле Имя введите имя проекта, например "FDD". Выберите кнопку ОК.

  2. Добавление исходного кода приложения.

    Откройте файл Program.cs или Program.vb в редакторе и замените автоматически созданный код приведенным ниже кодом. Он выводит запрос на ввод текста и отображает отдельные слова, введенные пользователем. Для разделения слов во введенном тексте в нем используется регулярное выражение \w+.

    using System;
    using System.Text.RegularExpressions;
    
    namespace Applications.ConsoleApps
    {
        public class ConsoleParser
        {
            public static void Main()
            {
                Console.WriteLine("Enter any text, followed by <Enter>:\n");
                String? s = Console.ReadLine();
                ShowWords(s ?? "You didn't enter anything.");
                Console.Write("\nPress any key to continue... ");
                Console.ReadKey();
            }
    
            private static void ShowWords(String s)
            {
                String pattern = @"\w+";
                var matches = Regex.Matches(s, pattern);
                if (matches.Count == 0)
                {
                    Console.WriteLine("\nNo words were identified in your input.");
                }
                else
                {
                    Console.WriteLine($"\nThere are {matches.Count} words in your string:");
                    for (int ctr = 0; ctr < matches.Count; ctr++)
                    {
                        Console.WriteLine($"   #{ctr,2}: '{matches[ctr].Value}' at position {matches[ctr].Index}");
                    }
                }
            }
        }
    }
    
    Imports System.Text.RegularExpressions
    
    Namespace Applications.ConsoleApps
        Public Module ConsoleParser
            Public Sub Main()
                Console.WriteLine("Enter any text, followed by <Enter>:")
                Console.WriteLine()
                Dim s = Console.ReadLine()
                ShowWords(s)
                Console.Write($"{vbCrLf}Press any key to continue... ")
                Console.ReadKey()
            End Sub
    
            Private Sub ShowWords(s As String)
                Dim pattern = "\w+"
                Dim matches = Regex.Matches(s, pattern)
                Console.WriteLine()   
                If matches.Count = 0 Then
                    Console.WriteLine("No words were identified in your input.")
                Else
                    Console.WriteLine($"There are {matches.Count} words in your string:")
                    For ctr = 0 To matches.Count - 1
                        Console.WriteLine($"   #{ctr,2}: '{matches(ctr).Value}' at position {matches(ctr).Index}")
                    Next
                End If
                Console.WriteLine()
            End Sub
        End Module
    End Namespace
    
    
  3. Создайте отладочную сборку приложения.

    Выберите Сборка>Собрать решение. Также можно скомпилировать и выполнить отладочную сборку приложения, выбрав Отладка>Начать отладку.

  4. Развертывание приложения.

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

    1. На панели инструментов измените конфигурацию решения с Отладка на Выпуск, чтобы собрать версию выпуска (а не отладочную версию) приложения.

    2. Щелкните правой кнопкой мыши проект (не решение) в обозревателе решений и выберите Опубликовать.

    3. На вкладке Публикация выберите Опубликовать. Visual Studio записывает файлы, которые составляют приложение, в локальную файловую систему.

    4. Теперь на вкладке Публикация отображается один профиль — FolderProfile. Параметры конфигурации профиля отображаются на вкладке в разделе Сводка.

    Итоговые файлы помещаются в каталог с именем Publish в Windows и publish в системах Unix, который находится в подкаталоге каталога проекта .\bin\release\netcoreapp2.1.

Помимо файлов приложения, процесс публикации создает файл базы данных программы (PDB), который содержит отладочную информацию о приложении. Файл используется в основном для отладки исключений. Его можно не упаковывать вместе с файлами приложения. Однако его следует сохранить на случай, если потребуется выполнить отладку сборки выпуска приложения.

Любым способом разверните полный набор файлов приложения. Например, их можно упаковать в ZIP-файл, использовать простую команду copy или развернуть их с помощью любого установочного пакета на ваш выбор. После установки пользователи могут выполнять приложение с помощью команды dotnet, указав имя файла приложения, например dotnet fdd.dll.

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

развертывание, зависящее от платформы, с зависимостями сторонних разработчиков;

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

  1. С помощью диспетчера пакетов NuGet добавьте ссылку на пакет NuGet в проект, а если пакет еще недоступен в системе, установите его. Чтобы открыть диспетчер пакетов, последовательно выберите Сервис>Диспетчер пакетов NuGet>Управление пакетами NuGet для решения.

  2. Убедитесь, что в вашей системе установлены зависимости от сторонних разработчиков (например, Newtonsoft.Json), если это не так, установите их. На вкладке Установленные перечислены пакеты NuGet, установленные в системе. Если Newtonsoft.Json отсутствует в списке, откройте вкладку Обзор и введите "Newtonsoft.Json" в поле поиска. Выберите Newtonsoft.Json и в области справа выберите проект, прежде чем нажать кнопку Установить.

  3. Если Newtonsoft.Json уже установлен в системе, добавьте его в проект, выбрав проект в правой области на вкладке Управление пакетами для решения.

Переносимость зависящего от платформы развертывания с зависимостями сторонних разработчиков напрямую зависит от переносимости этих зависимостей. Например, если библиотека стороннего разработчика поддерживает только Mac OS, приложение нельзя перенести в системы Windows. Это происходит, если зависимость стороннего разработчика сама зависит от машинного кода. Хорошим примером является сервер Kestrel, требующий собственной зависимости от libuv. Когда зависящее от платформы развертывание создается для приложения с таким типом зависимости стороннего разработчика, опубликованные выходные данные содержат папку для каждого идентификатора среды выполнения (RID), поддерживаемого зависимостью (и имеющегося в ее пакете NuGet).

Автономное развертывание без сторонних зависимостей

Выполнение автономного развертывания без зависимостей сторонних разработчиков предполагает создание проекта, изменение файла csproj, сборку, тестирование и публикацию приложения. Проиллюстрируем этот процесс на примере простого приложения, написанного на языке C#. Вы начнете с создания, программирования и тестирования проекта, как и при развертывании, зависимом от платформы.

  1. Создание проекта.

    Выберите File>New>Project ( Файл > Создать > Проект). В диалоговом окне Создать проект разверните категории проекта своего языка (C# или Visual Basic) на панели типов проектов Установлено, выберите .NET Core, а затем выберите шаблон Консольное приложение (.NET Core) на центральной панели. В поле Имя введите имя проекта, например "SCD", а затем нажмите кнопку ОК.

  2. Добавление исходного кода приложения.

    Откройте файл Program.cs или Program.vb в редакторе и замените автоматически созданный код приведенным ниже кодом. Он выводит запрос на ввод текста и отображает отдельные слова, введенные пользователем. Для разделения слов во введенном тексте в нем используется регулярное выражение \w+.

    using System;
    using System.Text.RegularExpressions;
    
    namespace Applications.ConsoleApps
    {
        public class ConsoleParser
        {
            public static void Main()
            {
                Console.WriteLine("Enter any text, followed by <Enter>:\n");
                String? s = Console.ReadLine();
                ShowWords(s ?? "You didn't enter anything.");
                Console.Write("\nPress any key to continue... ");
                Console.ReadKey();
            }
    
            private static void ShowWords(String s)
            {
                String pattern = @"\w+";
                var matches = Regex.Matches(s, pattern);
                if (matches.Count == 0)
                {
                    Console.WriteLine("\nNo words were identified in your input.");
                }
                else
                {
                    Console.WriteLine($"\nThere are {matches.Count} words in your string:");
                    for (int ctr = 0; ctr < matches.Count; ctr++)
                    {
                        Console.WriteLine($"   #{ctr,2}: '{matches[ctr].Value}' at position {matches[ctr].Index}");
                    }
                }
            }
        }
    }
    
    Imports System.Text.RegularExpressions
    
    Namespace Applications.ConsoleApps
        Public Module ConsoleParser
            Public Sub Main()
                Console.WriteLine("Enter any text, followed by <Enter>:")
                Console.WriteLine()
                Dim s = Console.ReadLine()
                ShowWords(s)
                Console.Write($"{vbCrLf}Press any key to continue... ")
                Console.ReadKey()
            End Sub
    
            Private Sub ShowWords(s As String)
                Dim pattern = "\w+"
                Dim matches = Regex.Matches(s, pattern)
                Console.WriteLine()   
                If matches.Count = 0 Then
                    Console.WriteLine("No words were identified in your input.")
                Else
                    Console.WriteLine($"There are {matches.Count} words in your string:")
                    For ctr = 0 To matches.Count - 1
                        Console.WriteLine($"   #{ctr,2}: '{matches(ctr).Value}' at position {matches(ctr).Index}")
                    Next
                End If
                Console.WriteLine()
            End Sub
        End Module
    End Namespace
    
    
  3. Определите, хотите ли вы использовать инвариантный режим глобализации.

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

    Чтобы включить инвариантный режим, щелкните правой кнопкой мыши проект (не решение) в обозревателе решений и выберите Изменить SCD.csproj или Изменить SCD.vbproj. Затем добавьте следующие выделенные строки в файл:

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <TargetFramework>net6.0</TargetFramework>
        <Nullable>enable</Nullable>
      </PropertyGroup>
    
      <ItemGroup>
        <RuntimeHostConfigurationOption Include="System.Globalization.Invariant" Value="true" />
      </ItemGroup> 
    
    </Project>
    
  4. Создание отладочной сборки приложения.

    Выберите Сборка>Собрать решение. Также можно скомпилировать и выполнить отладочную сборку приложения, выбрав Отладка>Начать отладку. Этот шаг отладки позволяет выявить проблемы в приложении, когда оно выполняется на вашей платформе. Его все равно придется тестировать на каждой целевой платформе.

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

Когда вы закончите отладку, вы можете опубликовать автономное развертывание.

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

Для публикации приложения из Visual Studio выполните следующие действия.

  1. Определите платформы, для которых будет предназначено приложение.

    1. Щелкните правой кнопкой мыши проект (не решение) в обозревателе решений и выберите Изменить SCD.csproj.

    2. В разделе <PropertyGroup> файла csproj создайте тег <RuntimeIdentifiers>, определяющий платформы, для которых предназначено приложение, и укажите идентификатор среды выполнения (RID) каждой целевой платформы. Для разделения идентификаторов RID необходимо добавлять точку с запятой. Список идентификаторов сред выполнения см. в каталоге идентификаторов сред выполнения.

    Например, в следующем примере указано, что приложение работает в 64-разрядных операционных системах Windows и 64-разрядной операционной системе OS X.

    <PropertyGroup>
       <RuntimeIdentifiers>win-x64;osx-x64</RuntimeIdentifiers>
    </PropertyGroup>
    

    Элемент <RuntimeIdentifiers> можно переносить в другие группы <PropertyGroup> в пределах файла csproj. Полный пример файла csproj будет приведен далее в этом разделе.

  2. Опубликуйте приложение.

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

    Для публикации приложения из Visual Studio выполните следующие действия.

    1. На панели инструментов измените конфигурацию решения с Отладка на Выпуск, чтобы собрать версию выпуска (а не отладочную версию) приложения.

    2. Щелкните правой кнопкой мыши проект (не решение) в обозревателе решений и выберите Опубликовать.

    3. На вкладке Публикация выберите Опубликовать. Visual Studio записывает файлы, которые составляют приложение, в локальную файловую систему.

    4. Теперь на вкладке Публикация отображается один профиль — FolderProfile. Параметры конфигурации профиля отображаются в разделе сводки на вкладке. Целевая среда выполнения определяет, какая среда выполнения была опубликована, а целевое расположение определяет, где были записаны файлы для автономного развертывания.

    5. По умолчанию Visual Studio записывает все опубликованные файлы в один каталог. Для удобства рекомендуется создать отдельные профили для каждой целевой среды выполнения и размещать опубликованные файлы в каталоге для определенной платформы. Это предполагает создание отдельного профиля публикации для каждой целевой платформы. Теперь выполните повторную сборку приложения для каждой платформы следующим образом.

      1. Выберите Создать новый профиль в диалоговом окне Публикация.

      2. В диалоговом окне выбора целевого объекта публикации измените расположение папки на bin\Release\PublishOutput\win-x64. Нажмите ОК.

      3. В списке профилей выберите новый профиль (FolderProfile1) и убедитесь, что параметр Целевая среда выполнения имеет значение win-x64. В противном случае выберите Параметры. В диалоговом окне Параметры профиля измените значение параметра Целевая среда выполнения на win-x64, а затем нажмите кнопку Сохранить. В противном случае выберите Отмена.

      4. Выберите Опубликовать, чтобы опубликовать приложение для 64-разрядных платформ Windows 10.

      5. Выполните приведенные выше шаги еще раз, чтобы создать профиль для платформы osx-x64. Целевое расположениеbin\Release\PublishOutput\osx-x64, а целевая среда выполненияosx-x64. Visual Studio присваивает этому профилю имя FolderProfile2.

    Каждое целевое расположение содержит полный набор файлов (как файлов приложения, так и всех файлов .NET Core), необходимых для запуска приложения.

Помимо файлов приложения, процесс публикации создает файл базы данных программы (PDB), который содержит отладочную информацию о приложении. Файл используется в основном для отладки исключений. Его можно не упаковывать вместе с файлами приложения. Однако его следует сохранить на случай, если потребуется выполнить отладку сборки выпуска приложения.

Разверните опубликованные файлы любым способом. Например, их можно упаковать в ZIP-файл, использовать простую команду copy или развернуть их с помощью любого установочного пакета на ваш выбор.

Ниже приведено полное содержимое файла csproj для этого проекта.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <RuntimeIdentifiers>win-x64;osx-x64</RuntimeIdentifiers>
  </PropertyGroup>
</Project>

Автономное развертывание с зависимостями сторонних разработчиков

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

  1. С помощью диспетчера пакетов NuGet добавьте ссылку на пакет NuGet в проект, а если пакет еще недоступен в системе, установите его. Чтобы открыть диспетчер пакетов, последовательно выберите Сервис>Диспетчер пакетов NuGet>Управление пакетами NuGet для решения.

  2. Убедитесь, что в вашей системе установлены зависимости от сторонних разработчиков (например, Newtonsoft.Json), если это не так, установите их. На вкладке Установленные перечислены пакеты NuGet, установленные в системе. Если Newtonsoft.Json отсутствует в списке, откройте вкладку Обзор и введите "Newtonsoft.Json" в поле поиска. Выберите Newtonsoft.Json и в области справа выберите проект, прежде чем нажать кнопку Установить.

  3. Если Newtonsoft.Json уже установлен в системе, добавьте его в проект, выбрав проект в правой области на вкладке Управление пакетами для решения.

Ниже приведено полное содержимое файла csproj для этого проекта:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <RuntimeIdentifiers>win-x64;osx-x64</RuntimeIdentifiers>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="10.0.2" />
  </ItemGroup>
</Project>

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

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

См. также