msbuild manifest msdeploy slowcheetah

Usar MsBuild para generar el manifiesto de MsDeploy personalizado(destino del paquete)



manifest slowcheetah (1)

Todavía no tengo un informe completo para las personas que intentan aprender cómo funciona esto, pero ahora tengo un escrito sobre cómo lograr al menos este objetivo.

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

( Editar: el enlace está muerto por ahora. Avíseme si está interesado y puedo publicarlo en otro sitio ).

Mi guía sigue estos pasos generales:

  • Asegúrese de que el servicio se inicie al momento de la instalación (no es crucial, pero es más fácil de manejar)
  • Agregue el archivo Microsoft.WebApplication.targets a su proyecto, aunque no tenga un proyecto web. Esto habilita el objetivo Package MsBuild.
  • Agregue un archivo .targets personalizado a su proyecto que crea un manifiesto de paquete MsBuild personalizado
  • Agregue algunos scripts por lotes a su proyecto para detener / desinstalar e instalar el servicio
  • Agregue un archivo Parameters.xml para permitir cambiar el directorio de implementación de destino un poco más fácilmente
  • Configure las transformaciones de app.config utilizando el complemento SlowCheetah Visual Studio

Entonces puede empaquetar su proyecto con esta línea de comando:

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

Puede implementar el paquete resultante con esta línea de comando:

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

La parte más indocumentada de esto (a excepción de mi guía) es crear el manifiesto personalizado. Aquí hay un volcado de mi archivo actual (tenga en cuenta que todavía tiene problemas, pero puede runCommand ). Consulte esta pregunta: MsDeploy remoting ejecutando el manifiesto dos veces , y trate de usar únicamente los archivos por lotes directos de 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>

Estoy usando Web Deploy para empacar e implementar sitios web para mi producto. En particular, tengo dos proyectos diferentes en mi solución. Utilizo este método para implementar.

Tengo un tercer proyecto en la solución (un servicio de Windows) que también debe instalarse en el servidor web.

Sé que puedo escribir un manifiesto personalizado (para los dirPath , filePath y runCommand ) y llamar directamente a MsDeploy para implementarlo. Pero me gustaría aprovechar las tareas existentes de MsBuild para empaquetar mi servicio si es posible.

Veo que es posible hacer alguna personalización del archivo de manifiesto a través de los objetivos de msbuild:

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

Particularmente al usar el ítem MsDeploySourceManifest .

Después de hurgar en los archivos .targets apropiados, parece que iisApp o iisApp se iisApp a mi manifiesto si utilizo el destino del Package . Idealmente, me gustaría copiar un ensamblaje (o directorio), posiblemente establecer ACL y ejecutar installutil.exe en el servicio.

¿Es posible personalizar por completo el manifiesto generado por el objetivo del Package editando mi archivo csproj?

Si no es así, ¿existe una forma simple de construir un nuevo objetivo que haga el equivalente a Package , pero permitirme escupir un manifiesto completamente personalizado?