MSBuild - 等待x秒

时间:2016-12-16 16:27:54

标签: msbuild

我有一个部署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>

2 个答案:

答案 0 :(得分:7)

有多种选择:

  1. MSBuild Community Tasks内置Notice: Undefined index: list_item in X:\home\test.atk\www\php\get_list.php on line 6 任务。您可以像这样使用它:

    Sleep
  2. MSBuild Extension Pack还包含内置<Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" /> <Sleep Milliseconds="300" /> 任务,可提供睡眠功能。使用示例is here

  3. 当然,任何类型的cmd兼容等待都可以通过Thread命令运行:

    • 已经提到Exec
    • 我也<Exec Command="ping -n 6 127.0.0.1 > nul" />很适合我。
  4. 您可以为此目的定义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)" />

当然,如果超时到期且文件仍在使用中,两个解决方案都会失败,但是如果没有无限等待的风险,就无法做到这一点。