Asp.net

使 MSDeploy (Visual Studio) 不刪除 App_Data 文件夾,而是刪除其他所有內容

  • November 27, 2010

我正在使用 Visual Studio 的Publish按鈕來部署我的網站,並希望在伺服器上使用不同的 App_Data 文件夾。有一個複選框Leave extra files on destination (do not delete)可以防止我的 App_Data 文件夾被刪除,但是隨著網站的變化,它最終會積累很多殘留的文件。

有沒有辦法讓它在刪除所有內容時僅排除 App_Data ?

它可以在您手動呼叫 msdeploy 時完成 - 只需添加以下參數:

-skip:Directory=\\App_Data

請參閱Web 部署操作設置。路徑是一個正則表達式,所以它非常靈活。

如果您使用 VS 生成的 ProjectName.deploy.cmd 腳本進行部署,您還可以在 _MsDeployAdditionalFlags 環境變數中傳遞此參數(執行該腳本時)。

這是我為我們的需求想出的最好的方法(我們的情況和你類似)。我沒有嘗試將它與 VS 的發布按鈕集成,因為我們是從命令行部署的。

編輯:

自從我發布這個答案以來,我已經了解了一些關於 MSDeploy 的東西,所以我想我現在應該更新它。

首先,上面的跳過規則會跳過匹配路徑(App_Data)上的任何操作。如果需要更精細的控制,可以使用更詳細的語法。例如,只跳過刪除(在目標伺服器上保留任何額外文件,但添加任何新文件並更新現有文件):

-skip:skipaction='Delete',objectname='filePath',absolutepath='\\App_Data\\.*' -skip:skipaction='Delete',objectname='dirPath',absolutepath='\\App_Data\\.*'

這會跳過 App_Data 中所有文件和所有子文件夾(及其所有內容)的刪除,但不會阻止添加和更新。

另一個有用的事情是可以在項目文件 ( .csproj) 中定義跳過規則,以便它們自動包含在.deploy.cmd與包一起生成的腳本中。這使得無需通過 _MsDeployAdditionalFlags 將它們傳遞給腳本。

如果文件中包含以下內容,則將添加上述跳過規則csproj

<PropertyGroup>
 <OnBeforePackageUsingManifest>AddCustomSkipRules</OnBeforePackageUsingManifest>
</PropertyGroup>
<Target Name="AddCustomSkipRules">
 <ItemGroup>
   <MsDeploySkipRules Include="SkipDeleteAppData">
     <SkipAction>Delete</SkipAction>
     <ObjectName>filePath</ObjectName>
     <AbsolutePath>$(_Escaped_PackageTempDir)\\App_Data\\.*</AbsolutePath>
     <XPath>
     </XPath>
   </MsDeploySkipRules>
   <MsDeploySkipRules Include="SkipDeleteAppData">
     <SkipAction>Delete</SkipAction>
     <ObjectName>dirPath</ObjectName>
     <AbsolutePath>$(_Escaped_PackageTempDir)\\App_Data\\.*</AbsolutePath>
     <XPath>
     </XPath>
   </MsDeploySkipRules>
 </ItemGroup>
</Target>

(名稱AddCustomSkipRulesSkipDeleteAppData是完全任意的;$(_Escaped_PackageTempDir)應該可能需要,但實際上我總是看到它評估為空字元串)

有關詳細資訊,請參閱Web 部署:自定義部署包如何在 .csproj 文件中設置 MSDeploy 設置

一個警告:這只會將這些規則添加到.deploy.cmd腳本中,因此如果您想使用圖形 IIS 管理器進行包部署,它是無用的,因為它不使用該腳本(從 VS 部署可能也是如此,但我沒有’未檢查)。

引用自:https://stackoverflow.com/questions/4289440