Użycie MsBuild do wygenerowania niestandardowego manifestu MsDeploy (docelowy pakiet)

Używam Web Deploy do pakowania i wdrażania stron internetowych dla mojego produktu. W szczególności mam dwa różne projekty w moim rozwiązaniu, które wykorzystuję do wdrożenia tej metody.

Mam trzeci projekt w rozwiązaniu (usługa windows), który również musi być zainstalowany na serwerze WWW.

Wiem, że mogę napisać manifest niestandardowy (dla dirPath, filePath i runCommand dostawców) i bezpośrednio zadzwonić do MsDeploy wdrożyć go. Ale chciałbym wykorzystać istniejące zadania MsBuild do spakowania mojego Obsługa, jeśli to możliwe.

Widzę, że możliwe jest pewne dostosowanie pliku manifestu poprzez cele msbuild:

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

Szczególnie za pomocą MsDeploySourceManifest pozycji.

Po przebiciu się przez odpowiednie .pliki docelowe, wygląda na to, że contentPath lub iisApp zostaną dołączone do mojego manifestu, jeśli użyję celu Package. Najlepiej po prostu skopiować montaż (lub katalog), ewentualnie ustawić ACL i uruchomić installutil.exe w serwisie.

Czy można całkowicie dostosować manifest generowany przez cel Package, edytując mój plik csproj?

Jeśli nie, czy istnieje prosty sposób na zbudowanie nowego celu, który zrobi odpowiednik Package, a jednocześnie pozwoli mi wypluć całkowicie Niestandardowy manifest?

Author: Sayed Ibrahim Hashimi, 2011-09-15

1 answers

Nie mam jeszcze kompletnego zapisu dla osób próbujących dowiedzieć się, jak to działa, ale teraz mam zapis, jak przynajmniej osiągnąć ten cel.

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

(edit: link na razie nie działa. Daj mi znać, jeśli jesteś zainteresowany, a mogę go zamieścić gdzie indziej ).

Mój przewodnik przechodzi przez te ogólne kroki:

  • upewnij się, że usługa zaczyna się sama po instalacja (nie kluczowa, ale łatwiejsza w obsłudze)
  • Dodaj Microsoft.Webaplikacja.pliki docelowe do twojego projektu, nawet jeśli nie masz projektu internetowego. Włącza to cel Package MsBuild.
  • Dodaj zwyczaj .plik docelowy do projektu, który tworzy Niestandardowy manifest pakietu MsBuild
  • dodaj kilka skryptów wsadowych do projektu, aby zatrzymać / odinstalować i zainstalować usługę
  • Dodaj parametr.plik xml do obsługi zmiany docelowego katalogu wdrażania bit łatwiej
  • skonfiguruj aplikację.transformacje config przy użyciu dodatku Slowcheetah Visual Studio

Następnie możesz spakować swój projekt za pomocą tej linii poleceń:

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

Wynikowy pakiet można wdrożyć za pomocą tej linii poleceń:

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

Najbardziej nieudokumentowaną częścią tego (z wyjątkiem mojego przewodnika) jest tworzenie manifestu niestandardowego. Oto zrzut mojego bieżącego pliku (Uwaga, nadal jest trochę błędny, ale można go naprawić-Zobacz to pytanie: MsDeploy remoting executing manifest dwa razy - i staraj się używać tylko bezpośrednich plików wsadowych dla 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>
 16
Author: Merlyn Morgan-Graham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:17