我想使用 FAKE 部署一些 Windows 服务。
使用 FAKE 构建脚本部署包后,我使用部署后构建脚本 (*.fsx) 安装服务。

这一切都很好,只是一旦服务启动,文件就会被锁定。这禁止任何进一步的(更新)部署。

是否有可能在 FAKE.Deploy 尝试覆盖文件之前停止服务?

最佳答案

只是不要从 FAKE 解压缩它的目录安装您的服务。
像这样做:

  • 检查目标目录是否存在。如果不是
  • 则创建
  • 检查服务是否安装并在这种情况下卸载
  • 清理目标目录(确保删除所有内容)
  • 复制新版本的文件
  • 在目标目录中安装新版本的服务

  • 我的项目中的部署脚本:
    #r @"c:\Project\FAKE.Deploy\bin\FAKE\tools\FakeLib.dll"
    
    open Fake
    open System
    open System.IO
    
    let targetDirectory = @"c:\Project\Service"
    let runScript file =
        if File.Exists file then
            let result, messages =
                ExecProcessRedirected
                    (fun info ->
                        info.FileName <- file
                        info.WorkingDirectory <- targetDirectory)
                    (TimeSpan.FromMinutes 10.0)
            for msg in messages do
                (if msg.IsError then traceError else traceImportant) msg.Message
    
            if not result then
                failwithf "MyProc.exe returned with a non-zero exit code"
        else
            traceImportant <| sprintf "File %s is not found" file
    
    // *** Define Targets ***
    
    Target "EnsureDirectory" (fun () ->
        trace <| sprintf " --- Ensure that directory '%s' is exist --- " targetDirectory
        CreateDir targetDirectory
    )
    
    Target "UninstallService" (fun () ->
        trace " --- Uninstall service --- "
        targetDirectory @@ "uninstall.bat"
        |> runScript
    )
    
    Target "CleanDirectory" (fun () ->
        trace " --- Clean target directory --- "
        CleanDir targetDirectory
    )
    
    Target "CopyFiles" (fun () ->
        trace " --- Copy new files --- "
        XCopy (__SOURCE_DIRECTORY__ @@ "content") targetDirectory
    )
    
    Target "InstallService" (fun () ->
        trace " --- Install service --- "
        targetDirectory @@ "install.bat"
        |> runScript
    )
    
    Target "Deploy" DoNothing
    
    // *** Define Dependencies ***
    "EnsureDirectory"
      ==> "UninstallService"
      ==> "CleanDirectory"
      ==> "CopyFiles"
      ==> "InstallService"
      ==> "Deploy"
    
    // *** Start Build ***
    RunParameterTargetOrDefault "target" "Deploy"
    

    关于f# - Fake.Deploy 运行自定义 Windows 服务会锁定部署文件并因此更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27446800/

    10-11 23:15
    查看更多