Asp.net

在 Web Deploy 中指定不同步的文件夾

  • November 10, 2015

我使用以下腳本將我的 ASP.NET MVC 應用程序部署到我們的 Web 伺服器:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe MySolution.sln^
/p:Configuration=TeamCity-Test^
/p:OutputPath=bin^
/p:DeployOnBuild=True^
/p:DeployTarget=MSDeployPublish^
/p:MsDeployServiceUrl=https://mywebserver.com:8172/msdeploy.axd^
/p:username=MyDomain\MyUser^
/p:password=MyPassword^
/p:AllowUntrustedCertificate=True^
/p:DeployIisAppPath=mywebsitename.com^
/p:MSDeployPublishMethod=WMSVC

現在我需要指定不同步 /uploads 文件夾。我可以在這個腳本中指定嗎?謝謝!

澄清:我的項目中有 Uploads 文件夾。我想讓 Web Deploy 創建文件夾。我不希望它從我的 Web 伺服器中刪除文件夾/子文件夾/文件,因為它包含使用者上傳的內容。

澄清#2:我剛剛找到了這個SkipExtraFilesOnServer=True選項。但是,我不希望這是全球性的。我想將其設置為單個文件夾。

更新: 顯然,您真正想要的是阻止 web 部署刪除目標伺服器上的現有目錄,但仍然創建文件夾以防它不存在。您可以按如下方式完成此操作:

  • 在項目文件旁邊創建YourWebProjectName.wpp.targets文件,其中包含以下內容:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
     <MsDeploySkipRules Include="SkipELMAHFolderFiles">
     <SkipAction></SkipAction>
     <ObjectName>filePath</ObjectName>
     <AbsolutePath>$(_DestinationContentPath)\\NameOfYourFolder\\.*</AbsolutePath>
     <Apply>Destination</Apply>
     <XPath></XPath>
   </MsDeploySkipRules>

   <MsDeploySkipRules Include="SkipELMAHFolderChildFolders">
     <SkipAction></SkipAction>
     <ObjectName>dirPath</ObjectName>
     <AbsolutePath>$(_DestinationContentPath)\\NameOfYourFolder\\.*\\*</AbsolutePath>
     <Apply>Destination</Apply>
     <XPath></XPath>
   </MsDeploySkipRules>
 </ItemGroup>
</Project>

NameOfYourFolder相應地改變YourWebProjectName。這假設您將它放在根目錄中,我相信,如果不是這種情況,您可以使用相對路徑。

  • 第一個MsDeploySkipRules條目告訴 webdeploy 不要刪除 Name_OfYourFolder 中的任何文件
  • 第二個MsDeploySkipRules告訴 webdeploy 不要刪除 Name_OfYourFolder 中的任何子文件

此外,如果目標伺服器上不存在該文件夾,則要創建該文件夾,您必須執行以下操作:

  • 將文件夾包含到項目中
  • 在其中添加一個虛擬的DeployemntPlaceholder.txt文件並將其包含到項目中

需要DeployemntPlaceholder.txt來告訴 MSBUild 將文件夾添加到包中:忽略空文件夾。

我已經測試了這種方法,當您以顯示的方式執行發佈時,它可以正常工作。我已經使用這個答案來獲得正確的 msbuild 項目語法。我相信,這是一種自定義標誌的 MSBuild 方式,由 MSBuild 部署管道傳遞給 webdeploy。

如果您直接執行 MSDeploy,則可以按以下方式使用跳過參數:

-skip:objectname='filePath',absolutepath='logs\\.*\\someNameToExclude\.txt'

更新 2

您可能還希望在您的 \Uploads 文件夾上設置 ACL 寫入權限 - 有一個完整的指南可以做到這一點:在 Web Publish 上設置文件夾權限

考慮原始問題“在 Web Deploy 中指定不同步的文件夾”,最簡單的方法如下:

您可以創建發布配置文件並添加以下行:

<PropertyGroup>
 <ExcludeFilesFromDeployment>
   File1.aspx;File2.aspx
 </ExcludeFilesFromDeployment>
 <ExcludeFoldersFromDeployment>
   Folder1;Folder2
 </ExcludeFoldersFromDeployment>
</PropertyGroup> 

我已經測試了這種方法來排除使用發布配置文件的文件。這裡有一個簡單的指南(滾動到編輯 .pubxml 文件以排除 robots.txt部分)。

您也可以在 .wpp.targets 文件中執行此操作或編輯您的 csproj。在Visual Studio 和 ASP.NET 的 Web 部署常見問題解答中查看更多資訊

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