Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 假的。运行自定义Windows服务的部署会锁定部署文件,从而更新_F#_Windows Services_F# Fake - Fatal编程技术网

F# 假的。运行自定义Windows服务的部署会锁定部署文件,从而更新

F# 假的。运行自定义Windows服务的部署会锁定部署文件,从而更新,f#,windows-services,f#-fake,F#,Windows Services,F# Fake,我想使用FAKE部署一些Windows服务。 使用假构建脚本部署包后,我使用部署后构建脚本(*.fsx)安装服务 这一切都很好,只是一旦服务启动,文件就会被锁定。这禁止任何进一步的(更新)部署 是否有可能在FAKE之前停止服务。Deploy尝试覆盖文件?只是不要从FAKE解压缩服务的目录安装服务。 这样做: 检查目标目录是否存在。如果不是,就创建它 在这种情况下,请检查服务是否已安装并卸载 清理目标目录(确保所有内容都已删除) 复制新版本的文件 在目标目录中安装新版本的服务 我的项目中的部署脚本

我想使用FAKE部署一些Windows服务。 使用假构建脚本部署包后,我使用部署后构建脚本(*.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"
    
    #r@“c:\Project\FAKE.Deploy\bin\FAKE\tools\FakeLib.dll”
    开假
    开放系统
    开放系统
    让targetDirectory=@“c:\Project\Service”
    让我们运行脚本文件=
    如果File.Exists文件存在,则
    让结果,消息=
    ExecProcessRedirected
    (趣味资讯->
    info.FileName
    跟踪“---清除目标目录--”
    CleanDir目标目录
    )
    目标是“复制文件”(乐趣()->
    跟踪“---复制新文件--”
    XCopy(\uuuu源\u目录\uuuu@“内容”)targetDirectory
    )
    目标“InstallService”(乐趣()->
    跟踪“---安装服务---”
    targetDirectory@@@install.bat
    |>运行脚本
    )
    目标“部署”完成任何操作
    //***定义依赖项***
    “保证性”
    ==>“卸载服务”
    ==>“清洁目录”
    ==>“复制文件”
    =>“安装服务”
    =>“部署”
    //***开始构建***
    RunParameterTargetOrderFault“目标”“部署”
    
    我认为,最简单的解决方案是在批处理命令中封装假构建,并在运行部署脚本之前从批处理命令停止服务。问题是我使用的是fake.deploy,因此使用由fake创建的nuget包部署到远程VM。Fake.Deploy正在侦听该VM,提取收到的nuget包,然后执行随包提供的部署脚本(*.fsx)。我想在提取包之前停止服务。然后您可以查看以下内容:。似乎有一个api用于该用例。到目前为止,这似乎是最好的主意,但这意味着我必须关闭远程服务。除非我将一个(几乎)空的包部署到包含部署脚本的VM,该脚本在部署服务之前关闭服务。对我来说,这似乎是一个“好”的解决方案,不过我更希望有一个假的预部署脚本。部署执行后会停止服务。只需将服务复制到新目录并从那里安装即可。对于那些想知道,这是假的4-它确实需要一些调整才能在假的5中使用