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