ASP.NET веб-развертывание с помощью Visual Studio: развертывание дополнительных файлов

Том Дайкстра

Скачивание начального проекта

В этом руководстве показано, как развернуть (опубликовать) веб-приложение ASP.NET в веб-приложениях Службы приложений Azure или в стороннем поставщике услуг размещения с помощью Visual Studio 2012 или Visual Studio 2010. Сведения о серии см. в первом руководстве в серии.

Обзор

В этом руководстве показано, как расширить конвейер веб-публикации Visual Studio для выполнения дополнительной задачи во время развертывания. Задача заключается в копировании дополнительных файлов, не входящих в папку проекта, на целевой веб-сайт.

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

Переместите файл robots.txt

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

  1. В обозревателе решений щелкните правой кнопкой мыши файл robots.txt и нажмите кнопку "Исключить из проекта".

  2. С помощью проводника Windows создайте новую папку в папке решения и назовите ее ExtraFiles.

  3. Переместите файл robots.txt из папки проекта ContosoUniversity в папку ExtraFiles .

    Папка ExtraFiles

  4. С помощью средства FTP удалите файл robots.txt с промежуточного веб-сайта.

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

Обновление файла профиля публикации

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

  1. В Visual Studio откройте Staging.pubxml.

  2. В конце файла до закрывающего </Project> тега добавьте следующую разметку:

    <Target Name="CustomCollectFiles">
        <ItemGroup>
          <_CustomFiles Include="..\ExtraFiles\**\*" />
          <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
            <DestinationRelativePath>%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
          </FilesForPackagingFromProject>
        </ItemGroup>
      </Target>
    

    Этот код создает новый целевой объект , который собирает дополнительные файлы для развертывания. Цель состоит из одной или нескольких задач, которые MSBuild будет выполнять на основе указанных вами условий.

    Атрибут Include указывает, что папка, в которой нужно найти файлы , — ExtraFiles, расположенная на том же уровне, что и папка проекта. MSBuild собирает все файлы из этой папки и рекурсивно из любых вложенных папок (двойная звездочка указывает рекурсивные вложенные папки). С помощью этого кода можно поместить несколько файлов, а также файлы в подпапки внутри папки ExtraFiles, и все они будут развернуты.

    Элемент DestinationRelativePath указывает, что папки и файлы должны быть скопированы в корневую папку целевого веб-сайта в той же структуре файлов и папок, что и в папке ExtraFiles . Если вы хотите скопировать саму папку ExtraFiles, DestinationRelativePath значением будет ExtraFiles\%(RecursiveDir)%(имя файла)%(расширение).

  3. В конце файла до закрывающего </Project> тега добавьте следующую разметку, указывающую время выполнения нового целевого объекта.

    <PropertyGroup>
        <CopyAllFilesToSingleFolderForPackageDependsOn>
          CustomCollectFiles;
          $(CopyAllFilesToSingleFolderForPackageDependsOn);
        </CopyAllFilesToSingleFolderForPackageDependsOn>
    
        <CopyAllFilesToSingleFolderForMsdeployDependsOn>
          CustomCollectFiles;
          $(CopyAllFilesToSingleFolderForMsdeployDependsOn);
        </CopyAllFilesToSingleFolderForMsdeployDependsOn>
    </PropertyGroup>
    

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

    Теперь pubxml-файл выглядит следующим образом:

    <?xml version="1.0" encoding="utf-8"?>
    <!--
    This file is used by the publish/package process of your Web project. You can customize the behavior of this process
    by editing this MSBuild file. In order to learn more about this please visit https://go.microsoft.com/fwlink/?LinkID=208121. 
    -->
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <WebPublishMethod>MSDeploy</WebPublishMethod>
        <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
        <LastUsedPlatform>Any CPU</LastUsedPlatform>
        <SiteUrlToLaunchAfterPublish>http://contosou-staging.azurewebsites.net</SiteUrlToLaunchAfterPublish>
        <ExcludeApp_Data>True</ExcludeApp_Data>
        <MSDeployServiceURL>waws-prod-bay-001.publish.azurewebsites.windows.net:443</MSDeployServiceURL>
        <DeployIisAppPath>contosou-staging</DeployIisAppPath>
        <RemoteSitePhysicalPath />
        <SkipExtraFilesOnServer>False</SkipExtraFilesOnServer>
        <MSDeployPublishMethod>WMSVC</MSDeployPublishMethod>
        <UserName>$contosou-staging</UserName>
        <_SavePWD>True</_SavePWD>
        <PublishDatabaseSettings>
          <Objects xmlns="">
            <ObjectGroup Name="SchoolContext" Order="1" Enabled="True">
              <Destination Path="Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User ID=CU-staging-admin@sk0264hvc9;Password=" Name="Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User Id=CU-staging-admin@sk0264hvc9;Password=" />
              <Object Type="DbCodeFirst">
                <Source Path="DBMigration" DbContext="ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL" MigrationConfiguration="ContosoUniversity.DAL.Migrations.Configuration, ContosoUniversity.DAL" Origin="Configuration" />
              </Object>
            </ObjectGroup>
            <ObjectGroup Name="DefaultConnection" Order="2" Enabled="False">
              <Destination Path="Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User ID=CU-staging-admin@sk0264hvc9;Password=" Name="Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User Id=CU-staging-admin@sk0264hvc9;Password=" />
              <Object Type="DbDacFx">
                <PreSource Path="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-ContosoUniversity.mdf;Initial Catalog=aspnet-ContosoUniversity;Integrated Security=True" includeData="False" />
                <Source Path="$(IntermediateOutputPath)AutoScripts\DefaultConnection_IncrementalSchemaOnly.dacpac" dacpacAction="Deploy" />
              </Object>
              <UpdateFrom Type="Web.Config">
                <Source MatchValue="Data Source=(LocalDb)\v11.0;Integrated Security=SSPI;Initial Catalog=aspnet-ContosoUniversity;AttachDBFilename=|DataDirectory|\aspnet-ContosoUniversity.mdf" MatchAttributes="$(UpdateFromConnectionStringAttributes)" />
              </UpdateFrom>
              <Object Type="DbFullSql" Enabled="False">
                <Source Path="..\aspnet-data-prod.sql" Transacted="False" />
              </Object>
            </ObjectGroup>
          </Objects>
        </PublishDatabaseSettings>
        <EnableMSDeployBackup>False</EnableMSDeployBackup>
      </PropertyGroup>
      <ItemGroup>
        <MSDeployParameterValue Include="$(DeployParameterPrefix)DefaultConnection-Web.config Connection String">
          <ParameterValue>Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User Id=CU-staging-admin@sk0264hvc9;Password=</ParameterValue>
        </MSDeployParameterValue>
        <MSDeployParameterValue Include="$(DeployParameterPrefix)SchoolContext-Web.config Connection String">
          <ParameterValue>Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User Id=CU-staging-admin@sk0264hvc9;Password=</ParameterValue>
        </MSDeployParameterValue>
      </ItemGroup>
      <Target Name="CustomCollectFiles">
        <ItemGroup>
          <_CustomFiles Include="..\ExtraFiles\**\*" />
          <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
            <DestinationRelativePath>%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
          </FilesForPackagingFromProject>
        </ItemGroup>
      </Target>
      <PropertyGroup>
        <CopyAllFilesToSingleFolderForPackageDependsOn>
          CustomCollectFiles;
          $(CopyAllFilesToSingleFolderForPackageDependsOn);
        </CopyAllFilesToSingleFolderForPackageDependsOn>
    
        <CopyAllFilesToSingleFolderForMsdeployDependsOn>
          CustomCollectFiles;
          $(CopyAllFilesToSingleFolderForMsdeployDependsOn);
        </CopyAllFilesToSingleFolderForMsdeployDependsOn>
      </PropertyGroup>
    </Project>
    
  4. Сохраните и закройте файл Staging.pubxml .

Публикация в промежуточном режиме

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

При использовании публикации одним кликом можно убедиться в окне предварительного просмотра, что robots.txt будет скопировано. В противном случае используйте средство FTP, чтобы убедиться, что файлrobots.txt находится в корневой папке веб-сайта после развертывания.

Сводка

Это завершает серию руководств по развертыванию веб-приложения ASP.NET у стороннего поставщика хостинга. Дополнительные сведения о любом из разделов, описанных в этих руководствах, см. в схеме содержимого развертывания ASP.NET.

Дополнительные сведения

Если вы знаете, как работать с файлами MSBuild, можно автоматизировать многие другие задачи развертывания, написав код в PUBXML-файлах (для задач, относящихся к профилям) или файл project .wpp.targets (для задач, применяемых ко всем профилям). Дополнительные сведения о файлах .pubxml и .wpp.targets см. в статье Как изменить параметры развертывания в файлах публикации (.pubxml) и в файле .wpp.targets в веб-проектах Visual Studio. Основные сведения о коде MSBuild см. в статье "Анатомия файла проекта в серии корпоративных развертываний: общие сведения о файле проекта". Чтобы узнать, как работать с файлами MSBuild для выполнения задач в собственных сценариях, обратитесь к книге: Inside the Microsoft Build Engine: Using MSBuild and Team Foundation Build авторов Сайеда Ибрахима Хашими и Уильяма Бартоломью.

Благодарности

Я хотел бы поблагодарить следующих людей, которые внесли значительный вклад в содержимое этой серии учебников: