我有一个部署Web应用程序的MSBuild脚本。 它通过将“app_offline.htm”文件复制到服务器来停止当前的Web应用程序。 在此之后,它会删除其他文件,然后将新文件复制到服务器。
我需要在复制'app_offline.htm'和删除之间添加延迟。
当脚本尝试删除文件时,我的当前脚本会抛出错误,因为文件仍然处于锁定状态。
在MSBuild中执行此操作的最佳方法是什么?
我的停止任务看起来像这样......
<Target Name="Stop">
<WriteLinesToFile File="$(DeployDirectory)\app_offline.htm" Lines="Offline for maintenance" Overwrite="true" Encoding="Unicode"/>
</Target>
我的删除任务看起来像这样......
<Target Name="Clean">
<ItemGroup>
<Files Include="$(DeployDirectory)\**\*" Exclude="$(DeployDirectory)\app_offline.htm" />
<Files Include="$(LogDirectory)\*" />
</ItemGroup>
<Delete Files="@(Files)" />
</Target>
答案 0 :(得分:7)
有多种选择:
MSBuild Community Tasks内置Notice: Undefined index: list_item in X:\home\test.atk\www\php\get_list.php on line 6
任务。您可以像这样使用它:
Sleep
MSBuild Extension Pack还包含内置<Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" />
<Sleep Milliseconds="300" />
任务,可提供睡眠功能。使用示例is here。
当然,任何类型的cmd兼容等待都可以通过Thread
命令运行:
Exec
<Exec Command="ping -n 6 127.0.0.1 > nul" />
很适合我。您可以为此目的定义MSBuild内联C#任务:
<Exec Command="sleep 5" />
答案 1 :(得分:2)
您可以使用Exec任务来调用How to sleep for 5 seconds in Windows's Command Prompt? (or DOS)中的一个解决方案,例如ping是非英语的,所以应该工作。像
这样的东西<Exec Command="ping -n 6 127.0.0.1 > nul"/>
<Delete Files="@(Files)" />
另请参阅https://github.com/Microsoft/msbuild/issues/199:将来,删除任务可能会获得与复制任务现在类似的参数。所以另一种选择是使用Copy和重试计数集来尝试覆盖正在使用的一个文件,当成功时你知道它已经不再使用了,可以继续使用Delete:
<Copy SourceFiles="someFile" DestinationFile="$(DeployDirectory)\someFileInUse"
RetryDelayMilliseconds="1000" Retries="5"/>
<Delete Files="@(Files)" />
当然,如果超时到期且文件仍在使用中,两个解决方案都会失败,但是如果没有无限等待的风险,就无法做到这一点。