Fake.Deploy运行自定义Windows服务会锁定部署文件,从而更新

Ray*_*men 3 f# windows-services f#-fake

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

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

在FAKE.Deploy尝试覆盖文件之前,是否可以以某种方式停止服务?

Ser*_*hon 6

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

  1. 检查目标目录是否存在.如果不是,请创建它
  2. 在这种情况下检查服务是否已安装和卸载
  3. 清理目标目录(以确保删除所有内容)
  4. 复制新版本的文件
  5. 在目标目录中安装新版本的服务

我项目的部署脚本:

#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"
Run Code Online (Sandbox Code Playgroud)