Использование 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>