我使用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部署,但我没有检查)。
你有没有看着封装/发布Web项目的设置,因为你可以告诉它在App_Data文件夹中的文件exlude。
从我的经验, MsDeploySkipRules
从命令行进行部署时才会运行。
如果您从Visual Studio发布到Azure的(或使用其他Web部署方法),您可以设置发布时以下。
当“在目标中删除其他文件”被选中,就会使文件和要部署的文件夹,并在服务器上的那些之间的比较。
被警告,你可以,如果你有用户生成内容,如上传遇到的问题。 但可能会被存储在不同的位置,例如S3 / Azure存储这些文件夹被合作周围。
这不是理想的,因为你可能会复制大量的文件这样做(我不是),但这里是我的备份解决方案文件夹。 适应于文件夹移动到它会被发布的位置,在发布过程中。 把这个在您的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>
如果你只想做任何数量的特定的已知文件,请每个文件的一个副本块:
<Target Name="PreserveSelectedFiles" AfterTargets="GatherAllFilesToPublish" >
<Copy SourceFiles="$(publishUrl)\MYFILENAME.EXT"
DestinationFolder="$(ProjectDir)\obj\$(Configuration)\Package\PackageTmp\"
Condition="Exists('$(publishUrl)\MYFILENAME.EXT')"></Copy>
</Target>
对于asp.net核心的网络应用程序使用MsDeploySkipRules
中的csproj。
<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>
与您的根文件夹
https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-2.1#exclude-files
从PowerShell中,如果你想使用msdeploy.exe或myproj.deploy.cmd( 部署Web包 )与Web部署包发布时,以跳过删除App_Data文件夹,避免产生
All arguments must begin with "-"
错误,则必须在其在三重引号,例如跳跃指令:
myproj.deploy.cmd /y /u:myusername /p:mypass """-skip:Directory=\\App_Data"""
把这个在您的pubxml文件:
<ExcludeApp_Data>True</ExcludeApp_Data>