使 MSDeploy (Visual Studio) 不刪除 App_Data 文件夾,而是刪除其他所有內容
我正在使用 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>(名稱
AddCustomSkipRules和SkipDeleteAppData是完全任意的;$(_Escaped_PackageTempDir)應該可能需要,但實際上我總是看到它評估為空字元串)有關詳細資訊,請參閱Web 部署:自定義部署包和如何在 .csproj 文件中設置 MSDeploy 設置。
一個警告:這只會將這些規則添加到
.deploy.cmd腳本中,因此如果您想使用圖形 IIS 管理器進行包部署,它是無用的,因為它不使用該腳本(從 VS 部署可能也是如此,但我沒有’未檢查)。