2016-12-16 104 views
4

我有一个部署Web应用程序的MSBuild脚本。 它通过将“app_offline.htm”文件复制到服务器来停止当前的Web应用程序。 之后它删除其他文件,然后将新的文件复制到服务器。MSBuild - 等待x秒

我需要在复制'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> 

回答

3

有多个可用的选项:

  1. MSBuild Community Tasks内置了Sleep任务。您可以使用它像这样:

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

  3. 当然,任何一种CMD兼容等待能否正常工作以及通过Exec命令:

    • 已经提到<Exec Command="ping -n 6 127.0.0.1 > nul" />
    • 我也有<Exec Command="sleep 5" />工作对我来说很好。
  4. 您可以定义的MSBuild内嵌C#的任务,为此目的:

    <UsingTask TaskName="Sleep" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"> 
        <ParameterGroup> 
        <!-- Delay in milliseconds --> 
        <Delay ParameterType="System.Int32" Required="true" /> 
        </ParameterGroup> 
        <Task> 
        <Code Type="Fragment" Language="cs"> 
         <![CDATA[ 
    System.Threading.Thread.Sleep(this.Delay); 
    ]]> 
        </Code> 
        </Task> 
    </UsingTask> 
    
    ... 
    
    <Sleep Delay="5000"/> 
    
1

你可以使用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 SourceFiles="someFile" DestinationFile="$(DeployDirectory)\someFileInUse" 
     RetryDelayMilliseconds="1000" Retries="5"/> 
<Delete Files="@(Files)" /> 

中如果超时到期并且文件仍在使用中,则两种解决方案都会失败,但没有可以做到的事情而没有无限等待的风险。