2016-12-16 82 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)" /> 

中如果超時到期並且文件仍在使用中,則兩種解決方案都會失敗,但沒有可以做到的事情而沒有無限等待的風險。