Как работает веб публикация в Visual Studio

Sayed Ibrahim Hashimi

Веб публикация ASP.NET Core проектов значительно изменилась по сравнению с публикацией ASP.NET 4 проектов. Из данной статьи вы узнаете, как настроить процесс публикации. Инструкции касаются публикации из Visual Studio. Кроме того, см. Публикация и развертывание.

В ASP.NET при публикации веб проекта из Visual Studio использовался MSBuild, чтобы руководить всем процессом. Файл проекта (.csproj или .vbproj) используется для сбора файлов, которые должны быть опубликованы, а также для выполнения всех обновлений во время публикации (например, обновление web.config). Файл проекта содержит полный список файлов и их типов. Эта информация используется для определения файлов для публикации. Логика реализована в файле MSBuild .targets. Во время процесса публикации MSBuild вызывает Web Deploy (msdeploy.exe), чтобы перенести файлы к их конечному местоположению. Чтобы настроить процесс публикации, вам нужно обновить публикационный профиль, или файл проекта, с помощью пользовательских элементов MSBuild.

В ASP.NET Core процесс публикации упростился - мы больше не храним ссылки на файлы, содержащиеся в проекте. все файлы включены в проект по умолчанию (файлы могут быть удалены из проекта или из публикации при обновлении project.json). Если вы публикуете ASP.NET Core проект из Visual Studio, происходит следующее:

  1. В Properties\PublishProfiles\profilename.pubxml создается публикационный профиль. Публикационный профиль - это файл MSBuild.
  2. В Properties\PublishProfiles\profilename.ps1 создается PowerShell скрипт.
  3. Вызывается dotnet publish, чтобы собрать файлы для публикации во временной папке.
  4. Вызывается PowerShell скрипт, передающий свойства из публикационного профиля и временной папки на публикацию.

Чтобы создать публикационный профиль в Visual Studio, кликните правой клавишей мышки по проекту в Solution Explorer и выберите Publish.

../_images/image-1b.png

На рисунке выше каждый черный кружочек ● обозначает точку расширения, и далее мы рассмотрим каждую точку расширения.

Когда вы начинаете публикацию, закрывается публикационное диалоговое окно, а затем вызывается MSBuild, чтобы запустить процесс. Visual Studio вызывает MSBuild, чтобы сделать это, так что при публикации у вас возникает паритет между Visual Studio и командной строкой. Слой MSBuild довольно тонок, зачастую он просто вызывает dotnet publish. Давайте поближе рассмотрим dotnet publish.

Команда dotnet publish проверит project.json и папку проекта, чтобы определить файлы, которые должны быть опубликованы. Она разместить файлы, необходимые для запуска приложения, в одно папке, и все будет готово для отправки в пункт назначения.

После окончания работы dotnet publish вызывается PowerShell скрипт для публикационного профиля. Мы кратко обсудили то, как работает на высоком уровне, а теперь давайте рассмотрим структуру PowerShell скрипта, созданного для публикации.

Когда вы создаете публикационный профиль для ASP.NET Core проекта в Visual Studio, создается PowerShell скрипт, имеющий следующую структуру.

[cmdletbinding(SupportsShouldProcess=$true)]
param($publishProperties=@{}, $packOutput,$pubProfilePath, $nugetUrl)

$publishModuleVersion = '1.0.2-beta2'

# functions to bootstrap the process when Visual Studio is not installed
# have been removed to simplify this doc

try{
    if (!(Enable-PublishModule)){
        Enable-PackageDownloader
        Enable-NuGetModule -name 'publish-module' -version $publishModuleVersion -nugetUrl $nugetUrl
    }

    'Calling Publish-AspNet' | Write-Verbose
    # call Publish-AspNet to perform the publish operation
    Publish-AspNet -publishProperties $publishProperties -packOutput $packOutput -pubProfilePath $pubProfilePath
}
catch{
    "An error occurred during publish.n{0}" -f $_.Exception.Message | Write-Error
}

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

  1. Параметры скрипта
  2. Версию publish-module
  3. Вызов Publish-AspNet

Параметры скрипта определяют связь между Visual Studio и скриптом PowerShell. Вы не должны менять объявленные параметры, поскольку Visual Studio зависит от них. Вы можете добавить дополнительные параметры, но они должны стоять в конце.

Версия публикационного модуля, определенная $publishModuleVersion, указывает версию модуля, который будет использован. Валидные номера версий могут быть найдены здесь: пакет publish-module NuGet на nuget.org. После создания публикационного профиля определение скрипта закрепляется за конкретной версией пакета publish-module. Если вам нужно изменить версию скрипта, вы можете удалить файл .ps1, а затем снова сделать публикацию в Visual Studio, чтобы был создан новый скрипт.

Вызов Publish-AspNet перемещает файлы с локальной машины в конечную точку. В Publish-AspNet передаются все свойства, определенные в файле .pubxml, даже пользовательские свойства. При публикации с Web Deploy будет вызван msdeploy.exe для публикации файлов в конечную точку. Publish-AspNet передаются те же параметры, что и оригинальному скрипту. Чтобы получить больше информации по параметрам Publish-AspNet, используйте Get-Help Publish-AspNet. Если у вас возникла ошибка, что publish-module не загружен, загрузите его:

Import-Module “${env:ProgramFiles(x86)}\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web Tools\Publish\Scripts\1.0.1\publish-module.psm1"

с компьютера, где установлена Visual Studio. Теперь давайте обсудим, как настроить процесс публикации.

В предыдущем разделе мы рассмотрели процесс публикации.

../_images/image-1b.png

На изображении сверху представлены три основные точки расширения, и чаще всего вы будете использовать #3.

  1. Настройка вызова dotnet publish

Большинство разработчиков не настраивают эту точку расширения. Visual Studio начинает процесс публикации, вызывая MSBuild. Таким образом инициализируется среда и вызов dotnet publish. Если вам нужно настроить вызов, вы можете использовать элементы MSBuild в файле проекта (файл .xproj) или в публикационном профиле (файл .pubxml).

  1. Настройка dotnet publish

dotnet publish - это утилита командной строки, которая помогает при публикации ASP.NET Core приложения. Она является кроссплатформенной утилитой (то есть, ее можно использовать на Windows, Mac или Linux), и ей не требуется Visual Studio. Если кто-то в вашей команде не использует Visual Studio, вы можете использовать dnu команды для создания скриптов и публикации. При выполнении dotnet publish ее можно настроить для выполнения пользовательских команд до и после выполнения. Команды перечислены в project.json.

Поддерживаемые скрипты для публикации являются скриптами “до публикации” и “после публикации”. Шаблон ASP.NET Core Web Application проходит по умолчанию в этапе “до публикации”. Соответствующий отрывок project.json показан ниже.

"scripts": {
  "prepublish": [ "npm install", "bower install", "gulp clean", "gulp min" ]
}

Здесь представлены несколько вызовов.

С Visual Studio выполняются этапы “до публикации” и “после публикации” как часть вызова dotnet publish. Скрипт “после публикации” в project.json выполняется до того, как файлы публикуются удаленно, поскольку он срабатывает сразу же после завершения работы dotnet publish. Дальше мы рассмотрим настройку скрипта PowerShell, чтобы проконтролировать то, что случается с файлами, после того как они достигли целевой точки.

  1. Настройка публикационного профиля скрипта PowerShell

После создания публикационного профиля в Visual Studio создается скрипт PowerShell Properties\PublishProfiles\ProfileName.ps1. Скрипт делает следующее:

  1. Запускает dotnet publish, который упаковывает веб проект во временную папку, чтобы подготовить его для следующей фазы публикации.
  2. Напрямую вызывается скрипт PowerShell. Публикационные свойства и путь ко временной папке передаются как параметры. Обратите внимание, что при публикации временная папка удаляется.

Вызов Publish-AspNet:

  • Принимает контекст папки в $packOutput, содержащий результаты dotnet publish, и публикует его.
  • Публикационные свойства передаются в параметр скрипта $publishProperties.
  • $publishProperties - это хэш-таблица PowerShell, содержащая все свойства, объявленные в профильном файле .pubxml. Также она содержит значения текстовых заменителей для файлов или файлы, которые надо исключить. См. $publishProperties use Get-Help publish-aspnet –Examples.

Чтобы настроить этот процесс, вы можете напрямую отредактировать скрипт PowerShell. Чтобы выполнить действие перед началом публикации, добавьте это действие перед вызовом Publish-AspNet. Если вы хотите, чтобы действие выполнялось после публикации, добавьте соответствующий вызов после Publish-AspNet. Когда вызывается Publish-AspNet, контент директории $packOutput публикуется. Например, если вам нужно добавить файл во время процесса публикации, просто корректно его скопируйте в $packOutput перед вызовом Publish-AspNet. В коде внизу вы увидите, как сделать это.

# copy files from image repo to the wwwroot\external-images folder
$externalImagesSourcePath = 'C:\resources\external-images'
$externalImagesDestPath = (Join-Path "$packOutput\wwwroot" 'external-images')
if(-not (Test-Path $externalImagesDestPath)){
      New-Item -Path $externalImagesDestPath -ItemType Directory
}

Get-ChildItem $externalImagesSourcePath -File | Copy-Item -Destination $externalImagesDestPath

'Calling Publish-AspNet' | Write-Verbose
# call Publish-AspNet to perform the publish operation
Publish-AspNet -publishProperties $publishProperties -packOutput $packOutput -pubProfilePath $pubProfilePath

Здесь внешние изображения копируются из c:\resources\external-images to $packOutput\wwwroot\external-images. Перед началом операции копирования скрипт должен знать, что существует конечная папка. Поскольку операция копирования происходит до вызова Publish-AspNet, в публикацию будут добавлены новые файлы. Чтобы выполнять действия после того, как файлы достигли конечной папки, вы можете разместить команды после вызова Publish-AspNet.

Вы можете настроить, или даже полностью заменить, скрипт Publish-AspNet. Как упоминалось ранее, вы должны сохранять объявление параметров, но все остальное зависит от вас.

Поделись хорошей новостью с друзьями!
Следи за новостями!