更新:
显然,您真正想要的是阻止 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 将该文件夹添加到包中:忽略空文件夹。
我已经测试了这种方法,当您按照您展示的方式运行发布时,它可以正常工作。我使用this answer 来获得正确的msbuild 项目语法。我相信,这是一种自定义标志的 MSBuild 方式,由 MSBuild 部署管道传递给 webdeploy。
如果您直接运行 MSDeploy,则可以按以下方式使用跳过参数:
-skip:objectname='filePath',absolutepath='logs\\.*\\someNameToExclude\.txt'
更新 2
考虑到原始问题“指定文件夹在 Web Deploy 中不同步”,最简单的方法如下:
您可以创建发布配置文件并添加以下行:
<PropertyGroup>
<ExcludeFilesFromDeployment>
File1.aspx;File2.aspx
</ExcludeFilesFromDeployment>
<ExcludeFoldersFromDeployment>
Folder1;Folder2
</ExcludeFoldersFromDeployment>
</PropertyGroup>
我已经测试了这种使用发布配置文件排除文件的方法。一个简单的指南是 here(滚动到 编辑 .pubxml 文件以排除 robots.txt 部分)。
您也可以在 .wpp.targets 文件中执行此操作或编辑您的 csproj。在Web Deployment FAQ for Visual Studio and ASP.NET查看更多信息