webentwicklung-frage-antwort-db.com.de

MSDeploy überspringt Regeln bei Verwendung von MSBuild PublishProfile mit Visual Studio 2012

Ich versuche, mit WebDeploy eine Website mit benutzerdefinierten MSDeploy-Überspringregeln und einem in Visual Studio 2012 gespeicherten Veröffentlichungsprofil zu veröffentlichen.

Ich verwende das Veröffentlichungsprofil über die Befehlszeile, aber die Überspringregel zum Überspringen des Löschens eines Ordners funktioniert nicht.

Ich habe einen ErrorLog-Unterordner in meiner Webanwendung mit einer web.config-Datei, um die richtigen Ordnerberechtigungen festzulegen. Ohne Sprungregeln werden der Ordner ErrorLog und die Datei web.config normal veröffentlicht, aber alle vorhandenen Fehlerprotokolldateien im Ordner auf dem Server werden beim Veröffentlichen gelöscht.


Fehler mit <SkipAction>Delete</SkipAction>

Wenn ich meiner wpp.targets-Datei eine benutzerdefinierte Sprungregel hinzufüge, akzeptiert die Sprungregel keinen Wert mehr für das <SkipAction>-Element. Wenn ich <SkipAction>Delete</SkipAction> einstelle, erhalte ich folgende Fehlermeldung:

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]

Wenn ich einfach das Element <SkipAction> weglasse, wird der Ordner ErrorLog gelöscht, wenn er normalerweise veröffentlicht wird.

Wenn ich <SkipAction></SkipAction> einstelle, wird der Ordner ErrorLog beim Veröffentlichen gelöscht.

Wenn ich <KeyAttribute>Delete</KeyAttribute> einstelle, werden ErrorLog und die web.config-Datei normal veröffentlicht.

Meines Wissens nach müssen Sie MSBuild zum Verwenden benutzerdefinierter Überspringregeln über die Befehlszeile aufrufen, anstatt in VS 2012 zu veröffentlichen. Ich möchte jedoch weiterhin meine gespeicherten Veröffentlichungsprofile verwenden von VS 2012.


Meine MSBuild-Befehlszeile:

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>

Meine MSBuild-Ausgabe zeigt die benutzerdefinierte Überspringregel an, löscht aber immer noch die Dateien:

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.
23
nekno

Bearbeiten: Es stellt sich heraus, dass Sie Recht haben: Die Skip-Direktive wird ignoriert, wenn sie in Visual Studio ausgeführt wird.

Zum Glück gibt es eine Problemumgehung.

Was Sie wollen, ist das:

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

Außerdem müssen Sie verhindern, dass VS die UI-Task verwendet (die anscheinend einen Fehler in Bezug auf die Skip-Regeln enthält). Sie können dies tun, indem Sie in Ihrer Datei wpp.targets oder pubxml Folgendes deklarieren:

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

Ich habe dies lokal getestet und kann bestätigen, dass es wie gewünscht funktioniert: Die zusätzliche Datei wird aktualisiert, aber es werden keine Dateien im Verzeichnis gelöscht.

22
Richard Szalay

Als Referenz ist hier meine vollständige .wpp.targets-Datei mit der funktionierenden Überspringregel zum Überspringen des Löschens des Ordners ErrorLog und der benutzerdefinierten ACLs, damit der Ordner ErrorLog auf dem Server beschreibbar ist.

Ab VS 2012 Update 3 funktioniert dies nur beim Veröffentlichen mit MSBuild über die Befehlszeile mit den an MSBuild übergebenen Optionen DeployOnBuild=true;PublishProfile="Test Server - Web Deploy". Dieses funktioniert nicht beim Veröffentlichen aus 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>
8
nekno

Ein anderer Ansatz besteht darin, das Tag SkipAction zu vermeiden. Ich habe dieses Setup direkt aus VS 2013 erfolgreich verwendet:

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

Die einzige Einschränkung, soweit ich das beurteilen kann, ist, dass sowohl das Aktualisieren als auch das Löschen und Hinzufügen von Operationen ignoriert werden.

3
Hauge

Nach vielen Stunden durchs Netz schauen. Ich habe diese Datei als {myprojectname} .wpp.targets im Site-Stammordner erstellt. Dies funktioniert beim Veröffentlichen mit Visual Studio. Der Medienordner wird ignoriert. Ich benutze 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>
1
Sanjay

Das hat bei mir im Jahr 2015 geklappt, Website-Projekttyp:

<!--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>
0
Sgedda

Funktioniert für mich: Meine vollständige Datei prepprod.pubxml in meinem Ordner App_Data/PublishProfiles in meiner Weblösung. Web Deploy löscht in VS 2015 keine Dateien mehr aus dem Ordner "cachefiles" in webdeploy. Die erste PropertyGroup wurde mithilfe der Web Publishing-GUI in Visual Studio automatisch generiert. Ich habe die zweite PropertyGroup und den Abschnitt Target aus vorherigen Kommentaren hinzugefügt.

<?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>
0
Avi G

Ich denke, dass das Problem in falschem AbsolutePath ist. Es sollte ein regulärer Ausdruck sein, der mit einer Datei oder einem Ordner übereinstimmt. so sollte es richtig entkommen. Unten ist das Beispiel, das für mich funktioniert hat (ich wollte das Entfernen von app_offline.htm überspringen, um die Lieferung zu einem Teil einer größeren Bereitstellung zu machen).

<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>
0
Koman