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

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

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

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

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

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

особенно с помощью MsDeploySourceManifest товар.

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

можно ли полностью настроить манифест, созданный Package target, отредактировав мой файл csproj?

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

1 ответов


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

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

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

мой гид проходит через эти общие шаги:

  • убедитесь, что служба запускается сама по установке (не важно, но легче иметь дело с)
  • добавить Microsoft.Значение webapplication.целевой файл для вашего проекта, даже если у вас нет веб-проекта. Это позволяет Package цель MsBuild.
  • добавить пользовательский .целевой файл для проекта, который создает пользовательский манифест пакета MsBuild
  • добавьте несколько пакетных сценариев в проект, чтобы остановить/удалить и установить сервис
  • добавить параметры.xml-файл для поддержки изменения целевого каталога развертывания немного проще
  • настройки приложения.config преобразования с помощью slowcheetah Visual Studio аддон

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

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

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

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

самая недокументированная часть этого (за исключением моего гида) создание пользовательского манифеста. Вот дамп моего текущего файла (обратите внимание, он все еще немного глючит, но может быть исправлен-см. Этот вопрос:msdeploy remoting выполнение манифеста дважды - и старайтесь продолжать использовать только прямые пакетные файлы для 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>