Подтвердить что ты не робот

Использование MsBuild для создания персонализированного манифеста MsDeploy (целевой пакет)

Я использую Web Deploy для упаковки и развертывания веб-сайтов для моего продукта. В частности, у меня есть два разных проекта в моем решении. Я использую этот метод для развертывания.

У меня есть третий проект в решении (служба Windows), который также необходимо установить на веб-сервере.

Я знаю, что могу написать собственный манифест (для поставщиков dirPath, filePath и runCommand) и напрямую вызвать MsDeploy для его развертывания. Но я хотел бы использовать существующие задачи MsBuild для упаковки моего сервиса, если это возможно.

Я вижу, что можно выполнить некоторую настройку файла манифеста с помощью целей msbuild:

http://social.msdn.microsoft.com/Forums/en/msbuild/thread/1044058c-f762-456b-8a68-b0863027ce47

В частности, используя элемент MsDeploySourceManifest.

После прокрутки соответствующих файлов .targets, похоже, что либо contentPath, либо iisApp будет добавлен к моему манифесту, если я использую цель Package. В идеале я просто хотел бы скопировать сборку (или каталог), возможно установить списки ACL и выполнить installutil.exe в службе.

Возможно ли полностью настроить манифест, сгенерированный целевым объектом Package, путем редактирования моего файла csproj?

Если нет, существует ли простой способ создать новую цель, которая будет выполнять эквивалент Package, но позвольте мне выплюнуть полностью пользовательский манифест?

4b9b3361

Ответ 1

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

http://thehappypath.net/2011/11/21/using-msdeploy-for-windows-services/

(отредактируйте: ссылка сейчас мертва. Сообщите мне, если вы заинтересованы, и я могу опубликовать ее в другом месте).

Мой гид проходит следующие этапы:

  • Убедитесь, что служба запускается сама по себе при установке (неважно, но легче справиться)
  • Добавьте файл Microsoft.WebApplication.targets в свой проект, даже если у вас нет веб-проекта. Это позволяет использовать Package MsBuild.
  • Добавьте в проект собственный файл .targets, который создает пользовательский манифест пакета MsBuild
  • Добавьте в проект несколько пакетных скриптов, чтобы остановить/удалить и установить службу
  • Добавьте файл Parameters.xml для более легкой смены целевого каталога развертывания.
  • Настройте преобразования app.config, используя дополнение к Visual Studio для SlowCheetah

Затем вы можете упаковать свой проект с помощью этой командной строки:

msbuild MyProject.csproj /t:Package /p:Configuration=Debug

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

MyService.Deploy.cmd /Y /M:mywebserver -allowUntrusted

Самая недокументированная часть этого (кроме моего руководства) - это создание пользовательского манифеста. Здесь дамп моего текущего файла (заметьте, он по-прежнему немного глючит, но может быть исправлен - см. Этот вопрос: MsDeploy удаляет исполняемый манифест дважды - и попытайтесь сохранить для использования только прямых пакетных файлов для runCommand).

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- This file must be included before Microsoft.Web.Publishing.targets so we can hook into BeforeAddIisSettingAndFileContentsToSourceManifest -->

  <PropertyGroup>

    <!-- Include our targets -->
    <IncludeStopServiceCommand>True</IncludeStopServiceCommand>
    <IncludeSetCustomAclsProvider>True</IncludeSetCustomAclsProvider>
    <IncludeInstallServiceCommand>True</IncludeInstallServiceCommand>
    <IncludeMoveAppConfigToCorrectPackagePath>True</IncludeMoveAppConfigToCorrectPackagePath>

    <!-- Uncomment to enable more verbose MsBuild logging -->
    <!-- <EnablePackageProcessLoggingAndAssert>True</EnablePackageProcessLoggingAndAssert> -->

    <!-- Enable web.config transform, but hack it to work for app.config -->
    <ProjectConfigFileName>app.config</ProjectConfigFileName>
    <TransformWebConfigEnabled>True</TransformWebConfigEnabled>
    <UseParameterizeToTransformWebConfig>True</UseParameterizeToTransformWebConfig>

    <!-- Enable web project packaging, but hack it to work for non-web app -->
    <DeployAsIisApp>False</DeployAsIisApp>
    <IncludeIisSettingsOnPublish>False</IncludeIisSettingsOnPublish>
    <IncludeSetAclProviderOnDestination>False</IncludeSetAclProviderOnDestination>
    <DisableAllVSGeneratedMSDeployParameter>True</DisableAllVSGeneratedMSDeployParameter>

    <!-- Insert our custom targets into correct places in build process -->
    <BeforeAddIisSettingAndFileContentsToSourceManifest Condition="'$(BeforeAddIisSettingAndFileContentsToSourceManifest)'==''">
      $(BeforeAddIisSettingAndFileContentsToSourceManifest);
      AddStopServiceCommand;
    </BeforeAddIisSettingAndFileContentsToSourceManifest>

    <AfterAddIisSettingAndFileContentsToSourceManifest Condition="'$(AfterAddIisSettingAndFileContentsToSourceManifest)'==''">
      $(AfterAddIisSettingAndFileContentsToSourceManifest);
      AddSetCustomAclsProvider;
      AddInstallServiceCommand;
    </AfterAddIisSettingAndFileContentsToSourceManifest>

    <OnAfterCopyAllFilesToSingleFolderForPackage Condition="'$(OnAfterCopyAllFilesToSingleFolderForPackage)'==''">
      $(OnAfterCopyAllFilesToSingleFolderForPackage);
      MoveAppConfigToCorrectPackagePath;
    </OnAfterCopyAllFilesToSingleFolderForPackage>

  </PropertyGroup>

  <!-- Custom targets -->
  <Target Name="AddStopServiceCommand" Condition="'$(IncludeStopServiceCommand)'=='true'">
    <Message Text="Adding runCommand to stop the running Service" />
    <ItemGroup>

      <MsDeploySourceManifest Include="runCommand">
        <path>$(_MSDeployDirPath_FullPath)\bin\servicestop.bat</path>
        <waitInterval>20000</waitInterval>
        <AdditionalProviderSettings>waitInterval</AdditionalProviderSettings>
      </MsDeploySourceManifest>

    </ItemGroup>
  </Target>

  <Target Name="AddSetCustomAclsProvider" Condition="'$(IncludeSetCustomAclsProvider)'=='true'">
    <ItemGroup>

      <MsDeploySourceManifest Include="setAcl">
        <Path>$(_MSDeployDirPath_FullPath)</Path>
        <setAclUser>LocalService</setAclUser>
        <setAclAccess>FullControl</setAclAccess> <!-- Todo: Reduce these permissions -->
        <setAclResourceType>Directory</setAclResourceType>
        <AdditionalProviderSettings>setAclUser;setAclAccess;setAclResourceType</AdditionalProviderSettings>
      </MsDeploySourceManifest>

    </ItemGroup>
  </Target>

  <Target Name="AddInstallServiceCommand" Condition="'$(IncludeInstallServiceCommand)'=='true'">
    <Message Text="Adding runCommand to install the Service" />
    <ItemGroup>

      <MsDeploySourceManifest Include="runCommand">
        <path>cmd.exe /c $(_MSDeployDirPath_FullPath)\bin\serviceinstall.bat</path>
        <waitInterval>20000</waitInterval>
        <dontUseCommandExe>false</dontUseCommandExe>
        <AdditionalProviderSettings>waitInterval;dontUseCommandExe</AdditionalProviderSettings>
      </MsDeploySourceManifest>

    </ItemGroup>
  </Target>

  <Target Name="MoveAppConfigToCorrectPackagePath"
          Condition="'$(IncludeMoveAppConfigToCorrectPackagePath)'=='true'">
    <PropertyGroup>
      <OriginalAppConfigFilename>$(_PackageTempDir)\App.Config</OriginalAppConfigFilename>
      <TargetAppConfigFilename>$(_PackageTempDir)\bin\$(TargetFileName).config</TargetAppConfigFilename>
    </PropertyGroup>

    <Copy SourceFiles="$(OriginalAppConfigFilename)" DestinationFiles="$(TargetAppConfigFilename)" 
          Condition="Exists($(OriginalAppConfigFilename))" />
    <Delete Files="$(OriginalAppConfigFilename)" 
            Condition="Exists($(OriginalAppConfigFilename))" />
  </Target>

</Project>