vscode visual studio snippets snippet custom crear code visual-studio msbuild visual-studio-2012 msdeploy webdeploy

visual-studio - snippets - html snippet visual studio code



MSDeploy omite las reglas al usar MSBuild PublishProfile con Visual Studio 2012 (7)

Como referencia, aquí está mi archivo .wpp.targets completo con la regla de omisión activa para omitir la eliminación de la carpeta ErrorLog y las ACL personalizadas para hacer que la carpeta ErrorLog escribirse en el servidor.

A partir de la Actualización 3 de VS 2012, esto solo funciona cuando se publica con MSBuild desde la línea de comando con las DeployOnBuild=true;PublishProfile="Test Server - Web Deploy" pasadas a MSBuild. Esto no funcionará cuando se publique desde VS.

<?xml version="1.0" encoding="utf-8" ?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <UseMsdeployExe>true</UseMsdeployExe> <!-- Required for the MSDeploySkipRules to work --> <DeployManagedPipelineMode>Integrated</DeployManagedPipelineMode> </PropertyGroup> <PropertyGroup> <AfterAddIisSettingAndFileContentsToSourceManifest> $(AfterAddIisSettingAndFileContentsToSourceManifest); AddCustomSkipRules; </AfterAddIisSettingAndFileContentsToSourceManifest> </PropertyGroup> <Target Name="AddCustomSkipRules"> <Message Text="Adding Custom Skip Rules" /> <ItemGroup> <MsDeploySkipRules Include="SkipErrorLogFolder"> <SkipAction>Delete</SkipAction> <ObjectName>filePath</ObjectName> <AbsolutePath>ErrorLog</AbsolutePath> <XPath></XPath> </MsDeploySkipRules> </ItemGroup> </Target> <PropertyGroup> <AfterAddIisSettingAndFileContentsToSourceManifest> $(AfterAddIisSettingAndFileContentsToSourceManifest); SetCustomACLs; </AfterAddIisSettingAndFileContentsToSourceManifest> <AfterAddDeclareParametersItemsForContentPath> $(AfterAddDeclareParametersItemsForContentPath); SetCustomAclParameters; </AfterAddDeclareParametersItemsForContentPath> </PropertyGroup> <Target Name="SetCustomACLs"> <Message Text="Setting Custom ACLs" /> <ItemGroup> <!--Make sure the application pool identity has write permission to the download folder--> <MsDeploySourceManifest Include="setAcl" Condition="$(IncludeSetAclProviderOnDestination) And Exists(''$(_MSDeployDirPath_FullPath)/ErrorLog'')"> <Path>$(_MSDeployDirPath_FullPath)/ErrorLog</Path> <setAclAccess>Write</setAclAccess> <setAclResourceType>Directory</setAclResourceType> <AdditionalProviderSettings>setAclResourceType;setAclAccess</AdditionalProviderSettings> </MsDeploySourceManifest> </ItemGroup> </Target> <Target Name="SetCustomAclParameters"> <Message Text="Setting Custom ACL Parameters" /> <EscapeTextForRegularExpressions Text="$(_MSDeployDirPath_FullPath)"> <Output TaskParameter="Result" PropertyName="_EscapeRegEx_MSDeployDirPath" /> </EscapeTextForRegularExpressions> <ItemGroup> <MsDeployDeclareParameters Include="Add write permission to ErrorLog folder" Condition="$(IncludeSetAclProviderOnDestination) and Exists(''$(_MSDeployDirPath_FullPath)/ErrorLog'')"> <Kind>ProviderPath</Kind> <Scope>setAcl</Scope> <Match>^$(_EscapeRegEx_MSDeployDirPath)//ErrorLog$</Match> <Description>Add write permission to ErrorLog folder</Description> <DefaultValue>Default Web Site/ErrorLog</DefaultValue> <Value>$(DeployIisAppPath)/ErrorLog</Value> <Tags>Hidden</Tags> <Priority>$(VsSetAclPriority)</Priority> <ExcludeFromSetParameter>True</ExcludeFromSetParameter> </MsDeployDeclareParameters> </ItemGroup> </Target> </Project>

Intento utilizar WebDeploy para publicar un sitio web utilizando reglas de omisión MSDeploy personalizadas y un perfil de publicación guardado en Visual Studio 2012.

Tengo el perfil de publicación trabajando desde la línea de comandos, pero la regla de omisión para omitir la eliminación de una carpeta no funciona.

Tengo una subcarpeta ErrorLog en mi aplicación web con un archivo web.config dentro para establecer los permisos adecuados de la carpeta. Sin reglas de omisión, la carpeta ErrorLog y web.config archivo web.config se publican normalmente, pero todos los archivos de registro de errores existentes en la carpeta del servidor se eliminan en la publicación.

Error con <SkipAction>Delete</SkipAction>

Cuando agrego una regla de omisión personalizada a mi archivo wpp.targets , la regla de omisión ya no acepta un valor para el elemento <SkipAction> . Si configuro <SkipAction>Delete</SkipAction> , <SkipAction>Delete</SkipAction> el siguiente error:

C:/Program Files (x86)/MSBuild/Microsoft/VisualStudio/v11.0/Web/Microsoft.Web.Publishing.targets(4377,5): error : Web deployment task failed. (Unrecognized skip directive ''skipaction''. Must be one of the following: "objectName," "keyAttribute," "absolutePath," "xPath," "attributes.<name>.") [C:/inetpub/wwwroot/My.Website/My.Website/My.Website.csproj]

Si simplemente <SkipAction> elemento <SkipAction> , la carpeta ErrorLog se elimina cuando normalmente se publicaría.

Si configuro <SkipAction></SkipAction> , de nuevo, la carpeta ErrorLog se borrará al publicar.

Si configuro <KeyAttribute>Delete</KeyAttribute> , entonces ErrorLog y el archivo web.config se publican normalmente.

Tengo entendido que para usar reglas de omisión personalizadas, debe llamar a MSBuild desde la línea de comandos en lugar de publicar desde VS 2012. Sin embargo, me gustaría utilizar mis perfiles de publicación guardados, y entiendo que ahora es posible hacerlo. de VS 2012.

Mi línea de comando MSBuild:

C:/Windows/Microsoft.NET/Framework/v4.0.30319/MSBuild.exe My.Website.sln /p:Configuration=Release;DeployOnBuild=true;PublishProfile="Test Server - Web Deploy"

My.Website.wpp.targets:

<?xml version="1.0" encoding="utf-8" ?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <AfterAddIisSettingAndFileContentsToSourceManifest>AddCustomSkipRules</AfterAddIisSettingAndFileContentsToSourceManifest> </PropertyGroup> <Target Name="AddCustomSkipRules"> <Message Text="Adding Custom Skip Rules" /> <ItemGroup> <MsDeploySkipRules Include="SkipErrorLogFolder1"> <SkipAction></SkipAction> <KeyAttribute>Delete</KeyAttribute> <ObjectName>dirPath</ObjectName> <AbsolutePath>$(_Escaped_WPPAllFilesInSingleFolder)//ErrorLog$</AbsolutePath> <XPath></XPath> </MsDeploySkipRules> </ItemGroup> </Target> </Project>

Mi salida de MSBuild muestra la regla de omisión personalizada, pero sigue borrando los archivos:

GenerateMsdeployManifestFiles: Generate source manifest file for Web Deploy package/publish ... AddCustomSkipRules: Adding Custom Skip Rules MSDeployPublish: Start Web Deploy Publish the Application/package to http://testserver.domain.com/MSDEPLOYAGENTSERVICE ... Starting Web deployment task from source: manifest(C:/inetpub/wwwroot/My.Website/My.Website/obj/Release/Package/My.Website.SourceManifest.xml) to Destination: auto(). Deleting filePath (MyWeb/ErrorLog/test.txt). Updating setAcl (MyWeb/). Updating setAcl (MyWeb/). Updating filePath (MyWeb/ErrorLog/Web.config). Updating filePath (MyWeb/Web.config). Updating setAcl (MyWeb/). Updating setAcl (MyWeb/). Successfully executed Web deployment task. Publish is successfully deployed.


Creo que el problema está en AbsolutePath incorrecto. Debería ser una expresión regular para unir el archivo o la carpeta. por lo que debe ser escapado correctamente. A continuación se muestra el ejemplo que funcionó para mí (quería omitir la eliminación de app_offline.htm para hacer que la entrega sea parte de una implementación más grande)

<PropertyGroup> <PackageUsingManifestDependsOn>$(PackageUsingManifestDependsOn);AddCustomSkipRules</PackageUsingManifestDependsOn> </PropertyGroup> <Target Name="AddCustomSkipRules"> <ItemGroup> <MsDeploySkipRules Include="SkipAppOfflineOnDeploy"> <SkipAction></SkipAction> <ObjectName>filePath</ObjectName> <AbsolutePath>app_offline/.htm</AbsolutePath> <Apply>Destination</Apply> <XPath></XPath> </MsDeploySkipRules> </ItemGroup> </Target>


Después de muchas horas mirando a través de la red. Creé este archivo como {myprojectname} .wpp.targets en la carpeta raíz del sitio. funciona al publicar con Visual Studio. la carpeta de medios se ignora. Estoy usando VS 2010.

<?xml version="1.0" encoding="utf-8" ?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <UseMsdeployExe>true</UseMsdeployExe> <!-- Required for the MSDeploySkipRules to work --> <DeployManagedPipelineMode>Integrated</DeployManagedPipelineMode> </PropertyGroup> <PropertyGroup> <AfterAddIisSettingAndFileContentsToSourceManifest> $(AfterAddIisSettingAndFileContentsToSourceManifest); AddCustomSkipRules; </AfterAddIisSettingAndFileContentsToSourceManifest> </PropertyGroup> <Target Name="AddCustomSkipRules"> <Message Text="Adding Custom Skip Rules - WPP Targets 2" /> <ItemGroup> <MsDeploySkipRules Include="SkipErrorLogFolder"> <SkipAction>Delete</SkipAction> <ObjectName>dirPath</ObjectName> <AbsolutePath>media</AbsolutePath> <XPath></XPath> <Apply>Destination</Apply> </MsDeploySkipRules> </ItemGroup> </Target> </Project>


Esto funcionó para mí en vs 2015, tipo de proyecto de sitio web:

<!--Added inside existing <ProjectGroup> tag--> <AfterAddIisSettingAndFileContentsToSourceManifest>AddCustomSkipRules</AfterAddIisSettingAndFileContentsToSourceManifest> <!--Added new ProjectGroup tag inside <Project></Project>--> <PropertyGroup> <WebPublishMethod>MSDeploy</WebPublishMethod> </PropertyGroup> <!--Added inside existing <Project> tag at the bottom--> <Target Name="AddCustomSkipRules"> <Message Text="Adding Custom Skip Rules" /> <ItemGroup> <MsDeploySkipRules Include="SkipConfigFolder"> <SkipAction></SkipAction> <!--<KeyAttribute>Delete</KeyAttribute>--> <ObjectName>dirPath</ObjectName> <AbsolutePath>App_Data//Composite//Logfiles</AbsolutePath> <XPath> </XPath> </MsDeploySkipRules> </ItemGroup> </Target>


Funciona para mí: mi archivo Full prepprod.pubxml en mi carpeta App_Data / PublishProfiles en mi solución web. Web Deploy ya no elimina archivos de la carpeta cachefiles en webdeploy de VS 2015. El primer PropertyGroup se generó automáticamente utilizando la interfaz gráfica de publicación web en Visual Studio. Agregué el segundo PropertyGroup y la sección Target de comentarios anteriores.

<?xml version="1.0" encoding="utf-8"?> <!-- This file is used by the publish/package process of your Web project. You can customize the behavior of this process by editing this MSBuild file. In order to learn more about this please visit http://go.microsoft.com/fwlink/?LinkID=208121. --> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <WebPublishMethod>MSDeploy</WebPublishMethod> <LastUsedBuildConfiguration>Production</LastUsedBuildConfiguration> <LastUsedPlatform>Any CPU</LastUsedPlatform> <SiteUrlToLaunchAfterPublish>{masked}</SiteUrlToLaunchAfterPublish> <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish> <ExcludeApp_Data>False</ExcludeApp_Data> <MSDeployServiceURL>{masked}</MSDeployServiceURL> <DeployIisAppPath>{masked}</DeployIisAppPath> <RemoteSitePhysicalPath /> <SkipExtraFilesOnServer>False</SkipExtraFilesOnServer> <MSDeployPublishMethod>WMSVC</MSDeployPublishMethod> <MSDeployUseChecksum>true</MSDeployUseChecksum> <EnableMSDeployBackup>True</EnableMSDeployBackup> <UserName>{masked}</UserName> <_SavePWD>True</_SavePWD> <PublishDatabaseSettings> <Objects xmlns=""> </Objects> </PublishDatabaseSettings> <ExcludeFilesFromDeployment>packages.config;*.bat;*.sln;*.suo,*.p4ignore</ExcludeFilesFromDeployment> <ExcludeFoldersFromDeployment>packages;cachefiles;.ebextensions</ExcludeFoldersFromDeployment> </PropertyGroup> <PropertyGroup> <AfterAddIisSettingAndFileContentsToSourceManifest> $(AfterAddIisSettingAndFileContentsToSourceManifest); AddCustomSkipRules; </AfterAddIisSettingAndFileContentsToSourceManifest> </PropertyGroup> <Target Name="AddCustomSkipRules"> <Message Text="Adding Custom Skip Rules" /> <ItemGroup> <MsDeploySkipRules Include="SkipcachefilesFolder"> <objectName>dirPath</objectName> <absolutePath>cachefiles</absolutePath> </MsDeploySkipRules> </ItemGroup> </Target> </Project>


Otro enfoque es evitar la etiqueta SkipAction . He utilizado esta configuración con éxito directamente desde VS 2013:

<Target Name="AddCustomSkipRules" AfterTargets="AddIisSettingAndFileContentsToSourceManifest"> <Message Text="Adding Custom Skip Rules" /> <ItemGroup> <MsDeploySkipRules Include="SkipMedia"> <objectName>dirPath</objectName> <absolutePath>media</absolutePath> </MsDeploySkipRules> <MsDeploySkipRules Include="SkipUpload"> <objectName>dirPath</objectName> <absolutePath>upload</absolutePath> </MsDeploySkipRules> </ItemGroup> </Target>

La única advertencia, por lo que puedo decir, es que ignorará las operaciones de actualización, eliminación y adición.


Editar: Resulta que tienes razón: la directiva de omisión se ignora cuando se ejecuta desde Visual Studio.

Afortunadamente, hay una solución.

Lo que quieres es esto:

<!-- Skip the deletion of any file within the ErrorLog directory --> <MsDeploySkipRules Include="SkipErrorLogFolder1"> <SkipAction>Delete</SkipAction> <ObjectName>filePath</ObjectName> <AbsolutePath>ErrorLog</AbsolutePath> </MsDeploySkipRules>

Además, debe evitar que VS use la tarea de interfaz de usuario (que parece contener una falla relacionada con las reglas de omisión). Puede hacer esto declarando lo siguiente en su wpp.targets o pubxml:

<PropertyGroup> <UseMsDeployExe>true</UseMsDeployExe> </PropertyGroup>

He probado esto localmente y puedo confirmar que funciona como se desea: el archivo adicional se actualiza pero no se eliminan los archivos en el directorio.