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?
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>
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