我正在使用 Visual Studio 的Publish
按钮来部署我的网站,并希望在服务器上使用不同的 App_Data 文件夹。有一个复选框Leave extra files on destination (do not delete)
可以防止我的 App_Data 文件夹被删除,但是随着网站的变化,它最终会积累很多残留文件。
有没有办法让它在删除所有内容时仅排除 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 部署可能也是如此,但我没有'未检查)。
在 Powershell 中,如果您想使用使用 Web 部署包发布时生成的 msdeploy.exe 或 myproj.deploy.cmd(部署 Web 包),以跳过删除 App_Data 文件夹并避免
All arguments must begin with "-"
错误,您必须将 skip 指令用三引号引起来,例如:
myproj.deploy.cmd /y /u:myusername /p:mypass """-skip:Directory=\\App_Data"""
您是否在项目设置中查看了 Package/Publish Web,因为您可以告诉它排除 App_Data 文件夹中的文件。
对于 csproj 中使用的 asp.net 核心 Web 应用程序MsDeploySkipRules
。
<ItemGroup>
<MsDeploySkipRules Include="CustomSkipFile">
<ObjectName>filePath</ObjectName>
<AbsolutePath><dir_name>\\app_data</AbsolutePath>
</MsDeploySkipRules>
<MsDeploySkipRules Include="CustomSkipFile">
<ObjectName>dirPath</ObjectName>
<AbsolutePath><dir_name>\\app_data</AbsolutePath>
</MsDeploySkipRules>
</ItemGroup>
替换<dir_name>
为您的根文件夹
这并不理想,因为您可能正在复制很多文件(我不是),但这是我备份文件夹的解决方案。适合在发布过程中将文件夹移动到将要发布的位置。把它放在你的 pubxml 文件中:
<Project>
...
<Target Name="PreserveSelectedFolder" AfterTargets="GatherAllFilesToPublish">
<ItemGroup>
<SITEDIR Include="$(publishUrl)\App_Data\**\*.*" />
</ItemGroup>
<Copy SourceFiles="@(SITEDIR)"
DestinationFolder="$(ProjectDir)\obj\$(Configuration)\Package\PackageTmp\%(RecursiveDir)"></Copy>
</Target>
</Project>
如果您只想执行任意数量的特定已知文件,请为每个文件执行一个 Copy 块:
<Target Name="PreserveSelectedFiles" AfterTargets="GatherAllFilesToPublish" >
<Copy SourceFiles="$(publishUrl)\MYFILENAME.EXT"
DestinationFolder="$(ProjectDir)\obj\$(Configuration)\Package\PackageTmp\"
Condition="Exists('$(publishUrl)\MYFILENAME.EXT')"></Copy>
</Target>
把它放在你的 pubxml 文件中:
<ExcludeApp_Data>True</ExcludeApp_Data>