Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FAKE does not kill child processes on exit #2407

Closed
sergey-tihon opened this issue Oct 19, 2019 · 22 comments
Closed

FAKE does not kill child processes on exit #2407

sergey-tihon opened this issue Oct 19, 2019 · 22 comments

Comments

@sergey-tihon
Copy link
Member

sergey-tihon commented Oct 19, 2019

Description

When I start child process (and do not wait for process result) it continue run when fake script finish.

Repro steps

Full repro is here - https:/sergey-tihon/fake-process-kill

  1. ./script.fsx that we will run as child process
for x in [0..15] do
    printfn "%d" x
    System.Threading.Thread.Sleep(1000)
  1. FAKE script
Target.create "Run" (fun _ -> 
    CreateProcess.fromRawCommandLine "dotnet" "fsi ./script.fsx"
    |> (Proc.start >> ignore)
)

Target.create "All" ignore
"Run" ==> "All"
  1. Execute it
dotnet tool restore
dotnet fake run build.fsx

Expected behavior

I expect that FAKE script kill child processes faster than process print all 15 numbers
If I understand @matthid correctly, FAKE should stop all child processes automatically

Actual behavior

Child process continue execution after FAKE script
build_fsx_—_fake-process-kill

Known workarounds

Not yet
But one of possible workaround may be to return pid and write final target that kill child process by pid but as far as I know there is no way to get pid from Proc.start

Related information

  • macOS
  • fake-cli 5.17.0
  • .NET Core 3.0
@matthid
Copy link
Member

matthid commented Oct 19, 2019

Interestingly, I get (on windows):

$ git clone <repo>
$ ./build.sh
Tool 'fake-cli' (version '5.17.0') was restored. Available commands: fake

Restore was successful.
Extracted Paket.Restore.targets to: E:\Projects\fake-tests\fake-process-kill\.fake\build.fsx\.paket\Paket.Restore.targets (Can be disabled with PAKET_SKIP_RESTORE_TARGETS=true)
Starting full restore process.
Downloading Fake.Core.CommandLineParsing 5.17
Download of Fake.Core.CommandLineParsing 5.17 done in 4 seconds. (350 kbit/s, 0 MB)
Downloading Fake.Core.Context 5.17
Download of Fake.Core.Context 5.17 done in 1 second. (250 kbit/s, 0 MB)
Downloading Fake.Core.Environment 5.17
Download of Fake.Core.Environment 5.17 done in 1 second. (295 kbit/s, 0 MB)
Downloading Fake.Core.FakeVar 5.17
Download of Fake.Core.FakeVar 5.17 done in 1 second. (136 kbit/s, 0 MB)
Downloading Fake.Core.Process 5.17
Download of Fake.Core.Process 5.17 done in 1 second. (2276 kbit/s, 0 MB)
Downloading Fake.Core.SemVer 5.17
Download of Fake.Core.SemVer 5.17 done in 1 second. (289 kbit/s, 0 MB)
Downloading Fake.Core.String 5.17
Download of Fake.Core.String 5.17 done in 1 second. (353 kbit/s, 0 MB)
Downloading Fake.Core.Tasks 5.17
Download of Fake.Core.Tasks 5.17 done in 1 second. (109 kbit/s, 0 MB)
Downloading Fake.Core.Trace 5.17
Download of Fake.Core.Trace 5.17 done in 1 second. (813 kbit/s, 0 MB)
Downloading Fake.Core.Xml 5.17
Download of Fake.Core.Xml 5.17 done in 1 second. (210 kbit/s, 0 MB)
Downloading Fake.DotNet.Cli 5.17
Download of Fake.DotNet.Cli 5.17 done in 1 second. (789 kbit/s, 0 MB)
Downloading Fake.DotNet.Fsi 5.17
Download of Fake.DotNet.Fsi 5.17 done in 1 second. (315 kbit/s, 0 MB)
Downloading Fake.DotNet.MSBuild 5.17
Download of Fake.DotNet.MSBuild 5.17 done in 1 second. (593 kbit/s, 0 MB)
Downloading Fake.DotNet.NuGet 5.17
Download of Fake.DotNet.NuGet 5.17 done in 1 second. (862 kbit/s, 0 MB)
Downloading Fake.IO.FileSystem 5.17
Download of Fake.IO.FileSystem 5.17 done in 1 second. (759 kbit/s, 0 MB)
Downloading Fake.Net.Http 5.17
Download of Fake.Net.Http 5.17 done in 1 second. (342 kbit/s, 0 MB)
Downloading Fake.Tools.Git 5.17
Download of Fake.Tools.Git 5.17 done in 1 second. (420 kbit/s, 0 MB)
run All
Building project with version: LocalBuild
Shortened DependencyGraph for Target All:
<== All
   <== Run

The running order is:
Group - 1
  - Run
Group - 2
  - All
Starting target 'Run'
> "dotnet" fsi ./script.fsx (In: false, Out: false, Err: false)
Finished (Success) 'Run' in 00:00:00.0823979
Starting target 'All'
Finished (Success) 'All' in 00:00:00.0000655

---------------------------------------------------------------------
Build Time Report
---------------------------------------------------------------------
Target     Duration
------     --------
Run        00:00:00.0780118
All        00:00:00.0000183
Total:     00:00:00.1570977
Status:    Ok
---------------------------------------------------------------------
Killing all processes that are created by FAKE and are still running.
Trying to kill dotnet
Trying to kill process dotnet (Id = 12472)
Performance:
 - Cli parsing: 173 milliseconds
 - Packages: 30 seconds
   - Disk IO: 409 milliseconds
   - Average Download Time: 925 milliseconds
   - Number of downloads: 17
   - Average Request Time: 574 milliseconds
   - Number of Requests: 17
   - Creating Runtime Graph: 135 milliseconds
   - Retrieve Assembly List: 3 seconds
 - Script compiling: 2 seconds
 - Script analyzing: 189 milliseconds
 - Script running: 300 milliseconds
 - Script cleanup: 9 milliseconds
 - Runtime: 38 seconds
$

@sergey-tihon
Copy link
Member Author

sergey-tihon commented Oct 19, 2019

Really interesting... I also never understand this line

> "/Library/Frameworks/Mono.framework/Versions/Current/Commands/mono" --version (In: false, Out: true, Err: true)

Is mono still involved somehow to start dotnet?

@matthid
Copy link
Member

matthid commented Oct 19, 2019

The logic for this is here:
https:/fsharp/FAKE/blob/e7f52f93018182273a802c4c7c873e57d1d7bcad/src/app/Fake.Core.Process/Process.fs#L268-L329

Basically all processes are added to this list. As long as setKillCreatedProcesses is not called all processes are killed when the list is disposed (all fake variables should be disposed at the end).

I also never understand this line
Is mono still involved somehow to start dotnet?

Don't worry about it, when we detect some mono we initialize variables here: https:/fsharp/FAKE/blob/e7f52f93018182273a802c4c7c873e57d1d7bcad/src/app/Fake.Core.Process/Process.fs#L908-L930
Unfortunate but that's how it is. I guess as they are internal we might be able to lazy them...

@matthid
Copy link
Member

matthid commented Oct 19, 2019

I just tested CTRL+C if it works in that scenario as well. And indeed it does:

$ ./build.sh
Tool 'fake-cli' (version '5.17.0') was restored. Available commands: fake

Restore was successful.
The last restore is still up to date. Nothing left to do.
run All
Building project with version: LocalBuild
Shortened DependencyGraph for Target All:
<== All
   <== Run

The running order is:
Group - 1
  - Run
Group - 2
  - All
Starting target 'Run'
> "dotnet" fsi ./script.fsx (In: false, Out: false, Err: false)
0
Gracefully shutting down..
Press ctrl+c again to force quit
Killing all processes that are created by FAKE and are still running.
Trying to kill dotnet
Trying to kill process dotnet (Id = 15684)
Finished (Success) 'Run' in 00:00:05.0911119
Starting target 'All'
Finished (Failed) 'All' in 00:00:00.0001603

---------------------------------------------------------------------
Build Time Report
---------------------------------------------------------------------
Target     Duration
------     --------
Run        00:00:05.0872644
All        00:00:00.0000673   (The operation was canceled.)
Total:     00:00:05.1741657
Status:    Failure
---------------------------------------------------------------------
Performance:
 - Cli parsing: 190 milliseconds
 - Packages: 48 milliseconds
 - Script compiling: 2 seconds
 - Script analyzing: 203 milliseconds
 - Script running: 5 seconds
 - Script cleanup: 3 milliseconds
 - Runtime: 8 seconds

Can you run Fake with the verbose flag (fake -v)?

@sergey-tihon
Copy link
Member Author

Sure dotnet fake -v run build.fsx

 sergey@MacBook-Pro-Sergey  ~/github/fake-process-kill   master ●  ./build.sh 
Tool 'fake-cli' (version '5.17.0') was restored. Available commands: fake

Restore was successful.
runOrBuild ({ Script = Some "build.fsx"
  ScriptArguments = []
  FsiArgLine = []
  Debug = false
  NoCache = false
  RestoreOnlyGroup = false
  VerboseLevel = Verbose
  IsBuild = false })
FAKE 5 - F# Make (5.17.0) (this line is written to standard error, see https:/fsharp/FAKE/issues/2066)
prepareAndRunScriptRedirect(Script: build.fsx, fsiOptions: "")
Writing '/Users/sergey/github/fake-process-kill/.fake/build.fsx/intellisense.fsx'
Restoring with paket...
The last restore is still up to date. Nothing left to do.
Known dependencies: 
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Web.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Diagnostics.Contracts.dll (4.0.1.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.ServiceModel.Web.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Diagnostics.FileVersionInfo.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Net.Security.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Xml.XPath.XDocument.dll (4.0.3.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Xml.Linq.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Net.WebSockets.Client.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.IO.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Dynamic.Runtime.dll (4.0.11.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Runtime.Serialization.Xml.dll (4.1.3.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Security.Principal.dll (4.0.1.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Reflection.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Threading.ThreadPool.dll (4.0.12.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Net.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.IO.Compression.FileSystem.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.ComponentModel.EventBasedAsync.dll (4.0.11.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Runtime.CompilerServices.VisualC.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Threading.dll (4.0.11.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/netstandard.dll (2.0.0.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.IO.UnmanagedMemoryStream.dll (4.0.3.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Xml.XPath.dll (4.0.3.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Xml.XmlDocument.dll (4.0.3.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Resources.Writer.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Console.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Net.Sockets.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Net.Http.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Text.Encoding.Extensions.dll (4.0.11.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Net.NetworkInformation.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Security.Claims.dll (4.0.3.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.ComponentModel.Primitives.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.IO.FileSystem.DriveInfo.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Security.Cryptography.X509Certificates.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Reflection.Primitives.dll (4.0.1.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Runtime.Numerics.dll (4.0.1.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.IO.FileSystem.Watcher.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Diagnostics.TraceSource.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Linq.Expressions.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Threading.Timer.dll (4.0.1.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Runtime.InteropServices.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.IO.Pipes.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Text.RegularExpressions.dll (4.1.1.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Runtime.Serialization.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.IO.Compression.dll (4.1.3.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Threading.Tasks.Parallel.dll (4.0.1.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Collections.NonGeneric.dll (4.0.3.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Collections.Concurrent.dll (4.0.11.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Threading.Overlapped.dll (4.0.3.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Xml.Serialization.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Runtime.Handles.dll (4.0.1.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.ObjectModel.dll (4.0.11.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Net.WebHeaderCollection.dll (4.0.1.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Runtime.InteropServices.RuntimeInformation.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.ComponentModel.TypeConverter.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Linq.Parallel.dll (4.0.1.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Xml.XDocument.dll (4.0.11.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Security.SecureString.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.IO.FileSystem.Primitives.dll (4.0.3.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/mscorlib.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Security.Cryptography.Primitives.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.IO.Compression.ZipFile.dll (4.0.3.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Windows.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Linq.Queryable.dll (4.0.1.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Resources.ResourceManager.dll (4.0.1.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Resources.Reader.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Collections.dll (4.0.11.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Data.Common.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Net.NameResolution.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.ComponentModel.dll (4.0.1.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Xml.ReaderWriter.dll (4.1.1.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Threading.Tasks.dll (4.0.11.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Diagnostics.Tracing.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.AppContext.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Security.Cryptography.Csp.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Diagnostics.TextWriterTraceListener.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Text.Encoding.dll (4.0.11.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Transactions.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.IO.MemoryMappedFiles.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Globalization.dll (4.0.11.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Collections.Specialized.dll (4.0.3.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.ValueTuple.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Runtime.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Xml.XmlSerializer.dll (4.0.11.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Reflection.Extensions.dll (4.0.1.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Globalization.Extensions.dll (4.0.3.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Runtime.Extensions.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Data.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Security.Cryptography.Encoding.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.IO.IsolatedStorage.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Globalization.Calendars.dll (4.0.3.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Net.Requests.dll (4.0.11.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Net.WebSockets.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.IO.FileSystem.dll (4.0.3.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Runtime.Serialization.Json.dll (4.0.1.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Security.Cryptography.Algorithms.dll (4.2.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Threading.Thread.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Linq.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Diagnostics.Process.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Numerics.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Xml.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Diagnostics.Tools.dll (4.0.1.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.ComponentModel.Composition.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Diagnostics.Debug.dll (4.0.11.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/Microsoft.Win32.Primitives.dll (4.0.3.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Runtime.Serialization.Primitives.dll (4.1.3.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Drawing.Primitives.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Drawing.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Runtime.Serialization.Formatters.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Net.Ping.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Diagnostics.StackTrace.dll (4.0.4.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Core.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/netstandard.library/2.0.3/build/netstandard2.0/ref/System.Net.Primitives.dll (4.0.11.0)
         - lib: /Users/sergey/.nuget/packages/system.threading.tasks.dataflow/4.10.0/lib/netstandard2.0/System.Threading.Tasks.Dataflow.dll (4.6.4.0)
         - ref: /Users/sergey/.nuget/packages/system.threading.tasks.dataflow/4.10.0/lib/netstandard2.0/System.Threading.Tasks.Dataflow.dll (4.6.4.0)
         - lib: /Users/sergey/.nuget/packages/system.security.principal.windows/4.6.0/lib/netstandard2.0/System.Security.Principal.Windows.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/system.security.principal.windows/4.6.0/ref/netstandard2.0/System.Security.Principal.Windows.dll (4.1.1.0)
         - lib: /Users/sergey/.nuget/packages/system.security.cryptography.openssl/4.6.0/lib/netstandard2.0/System.Security.Cryptography.OpenSsl.dll (4.1.0.0)
         - ref: /Users/sergey/.nuget/packages/system.security.cryptography.openssl/4.6.0/ref/netstandard2.0/System.Security.Cryptography.OpenSsl.dll (4.1.0.0)
         - lib: /Users/sergey/.nuget/packages/system.security.cryptography.cng/4.6.0/lib/netstandard2.0/System.Security.Cryptography.Cng.dll (4.3.0.0)
         - ref: /Users/sergey/.nuget/packages/system.security.cryptography.cng/4.6.0/ref/netstandard2.0/System.Security.Cryptography.Cng.dll (4.3.0.0)
         - lib: /Users/sergey/.nuget/packages/system.runtime.compilerservices.unsafe/4.6.0/lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll (4.0.5.0)
         - ref: /Users/sergey/.nuget/packages/system.runtime.compilerservices.unsafe/4.6.0/ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll (4.0.5.0)
         - lib: /Users/sergey/.nuget/packages/system.reflection.typeextensions/4.6.0/lib/netstandard2.0/System.Reflection.TypeExtensions.dll (4.1.4.0)
         - ref: /Users/sergey/.nuget/packages/system.reflection.typeextensions/4.6.0/ref/netstandard2.0/System.Reflection.TypeExtensions.dll (4.1.2.0)
         - lib: /Users/sergey/.nuget/packages/system.reflection.emit.ilgeneration/4.6.0/lib/netstandard2.0/System.Reflection.Emit.ILGeneration.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/system.reflection.emit.ilgeneration/4.6.0/ref/netstandard2.0/System.Reflection.Emit.ILGeneration.dll (4.0.0.0)
         - lib: /Users/sergey/.nuget/packages/system.numerics.vectors/4.5.0/lib/netstandard2.0/System.Numerics.Vectors.dll (4.1.4.0)
         - ref: /Users/sergey/.nuget/packages/system.numerics.vectors/4.5.0/ref/netstandard2.0/System.Numerics.Vectors.dll (4.1.3.0)
         - lib: /Users/sergey/.nuget/packages/system.codedom/4.6.0/lib/netstandard2.0/System.CodeDom.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/system.codedom/4.6.0/ref/netstandard2.0/System.CodeDom.dll (4.0.2.0)
         - lib: /Users/sergey/.nuget/packages/system.buffers/4.5.0/lib/netstandard2.0/System.Buffers.dll (4.0.3.0)
         - ref: /Users/sergey/.nuget/packages/system.buffers/4.5.0/ref/netstandard2.0/System.Buffers.dll (4.0.2.0)
         - native: /Users/sergey/.nuget/packages/runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl/4.3.3/runtimes/osx.10.10-x64/native/System.Security.Cryptography.Native.OpenSsl.dylib
         - native: /Users/sergey/.nuget/packages/runtime.osx.10.10-x64.runtime.native.system.security.cryptography.apple/4.3.1/runtimes/osx.10.10-x64/native/System.Security.Cryptography.Native.Apple.dylib
         - lib: /Users/sergey/.nuget/packages/nuget.versioning/5.3.0/lib/netstandard2.0/NuGet.Versioning.dll (5.3.0.4)
         - ref: /Users/sergey/.nuget/packages/nuget.versioning/5.3.0/lib/netstandard2.0/NuGet.Versioning.dll (5.3.0.4)
         - lib: /Users/sergey/.nuget/packages/nuget.frameworks/5.3.0/lib/netstandard2.0/NuGet.Frameworks.dll (5.3.0.4)
         - ref: /Users/sergey/.nuget/packages/nuget.frameworks/5.3.0/lib/netstandard2.0/NuGet.Frameworks.dll (5.3.0.4)
         - lib: /Users/sergey/.nuget/packages/newtonsoft.json/12.0.2/lib/netstandard2.0/Newtonsoft.Json.dll (12.0.0.0)
         - ref: /Users/sergey/.nuget/packages/newtonsoft.json/12.0.2/lib/netstandard2.0/Newtonsoft.Json.dll (12.0.0.0)
         - lib: /Users/sergey/.nuget/packages/fsharp.core/4.7.0/lib/netstandard2.0/FSharp.Core.dll (4.7.0.0)
         - ref: /Users/sergey/.nuget/packages/fsharp.core/4.7.0/lib/netstandard2.0/FSharp.Core.dll (4.7.0.0)
         - lib: /Users/sergey/.nuget/packages/system.threading.tasks.extensions/4.5.3/lib/netstandard2.0/System.Threading.Tasks.Extensions.dll (4.2.0.1)
         - ref: /Users/sergey/.nuget/packages/system.threading.tasks.extensions/4.5.3/lib/netstandard2.0/System.Threading.Tasks.Extensions.dll (4.2.0.1)
         - lib: /Users/sergey/.nuget/packages/system.text.encoding.codepages/4.6.0/lib/netstandard2.0/System.Text.Encoding.CodePages.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/system.text.encoding.codepages/4.6.0/lib/netstandard2.0/System.Text.Encoding.CodePages.dll (4.1.2.0)
         - lib: /Users/sergey/.nuget/packages/system.security.accesscontrol/4.6.0/lib/netstandard2.0/System.Security.AccessControl.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/system.security.accesscontrol/4.6.0/ref/netstandard2.0/System.Security.AccessControl.dll (4.1.1.0)
         - lib: /Users/sergey/.nuget/packages/system.reflection.emit.lightweight/4.6.0/lib/netstandard2.0/System.Reflection.Emit.Lightweight.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/system.reflection.emit.lightweight/4.6.0/ref/netstandard2.0/System.Reflection.Emit.Lightweight.dll (4.0.0.0)
         - lib: /Users/sergey/.nuget/packages/system.reflection.emit/4.6.0/lib/netstandard2.0/System.Reflection.Emit.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/system.reflection.emit/4.6.0/ref/netstandard2.0/System.Reflection.Emit.dll (4.0.0.0)
         - lib: /Users/sergey/.nuget/packages/system.memory/4.5.3/lib/netstandard2.0/System.Memory.dll (4.0.1.1)
         - ref: /Users/sergey/.nuget/packages/system.memory/4.5.3/lib/netstandard2.0/System.Memory.dll (4.0.1.1)
         - lib: /Users/sergey/.nuget/packages/fake.core.string/5.17.0/lib/netstandard2.0/Fake.Core.String.dll (5.17.0.0)
         - ref: /Users/sergey/.nuget/packages/fake.core.string/5.17.0/lib/netstandard2.0/Fake.Core.String.dll (5.17.0.0)
         - lib: /Users/sergey/.nuget/packages/fake.core.environment/5.17.0/lib/netstandard2.0/Fake.Core.Environment.dll (5.17.0.0)
         - ref: /Users/sergey/.nuget/packages/fake.core.environment/5.17.0/lib/netstandard2.0/Fake.Core.Environment.dll (5.17.0.0)
         - lib: /Users/sergey/.nuget/packages/fake.core.context/5.17.0/lib/netstandard2.0/Fake.Core.Context.dll (5.17.0.0)
         - ref: /Users/sergey/.nuget/packages/fake.core.context/5.17.0/lib/netstandard2.0/Fake.Core.Context.dll (5.17.0.0)
         - lib: /Users/sergey/.nuget/packages/blackfox.vswhere/1.0.0/lib/netstandard2.0/BlackFox.VsWhere.dll (1.0.0.0)
         - ref: /Users/sergey/.nuget/packages/blackfox.vswhere/1.0.0/lib/netstandard2.0/BlackFox.VsWhere.dll (1.0.0.0)
         - lib: /Users/sergey/.nuget/packages/system.threading.thread/4.3.0/lib/netstandard1.3/System.Threading.Thread.dll (4.0.1.0)
         - lib: /Users/sergey/.nuget/packages/system.security.cryptography.protecteddata/4.6.0/lib/netstandard2.0/System.Security.Cryptography.ProtectedData.dll (4.0.4.0)
         - ref: /Users/sergey/.nuget/packages/system.security.cryptography.protecteddata/4.6.0/ref/netstandard2.0/System.Security.Cryptography.ProtectedData.dll (4.0.4.0)
         - lib: /Users/sergey/.nuget/packages/system.runtime.interopservices.windowsruntime/4.3.0/lib/netstandard1.3/System.Runtime.InteropServices.WindowsRuntime.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/system.runtime.interopservices.windowsruntime/4.3.0/ref/netstandard1.0/System.Runtime.InteropServices.WindowsRuntime.dll (4.0.0.0)
         - lib: /Users/sergey/.nuget/packages/system.resources.extensions/4.6.0/lib/netstandard2.0/System.Resources.Extensions.dll (4.0.0.0)
         - ref: /Users/sergey/.nuget/packages/system.resources.extensions/4.6.0/ref/netstandard2.0/System.Resources.Extensions.dll (4.0.0.0)
         - lib: /Users/sergey/.nuget/packages/system.io.filesystem.primitives/4.3.0/lib/netstandard1.3/System.IO.FileSystem.Primitives.dll (4.0.2.0)
         - lib: /Users/sergey/.nuget/packages/system.diagnostics.diagnosticsource/4.6.0/lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll (4.0.4.0)
         - ref: /Users/sergey/.nuget/packages/system.diagnostics.diagnosticsource/4.6.0/lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll (4.0.4.0)
         - lib: /Users/sergey/.nuget/packages/system.collections.immutable/1.6.0/lib/netstandard2.0/System.Collections.Immutable.dll (1.2.4.0)
         - ref: /Users/sergey/.nuget/packages/system.collections.immutable/1.6.0/lib/netstandard2.0/System.Collections.Immutable.dll (1.2.4.0)
         - lib: /Users/sergey/.nuget/packages/microsoft.win32.registry/4.6.0/runtimes/unix/lib/netstandard2.0/Microsoft.Win32.Registry.dll (4.1.2.0)
         - ref: /Users/sergey/.nuget/packages/microsoft.win32.registry/4.6.0/ref/netstandard2.0/Microsoft.Win32.Registry.dll (4.1.2.0)
         - lib: /Users/sergey/.nuget/packages/fparsec/1.0.3/lib/netstandard1.6/FParsec.dll (1.0.3.0)
         - lib: /Users/sergey/.nuget/packages/fparsec/1.0.3/lib/netstandard1.6/FParsecCS.dll (1.0.3.0)
         - ref: /Users/sergey/.nuget/packages/fparsec/1.0.3/lib/netstandard1.6/FParsec.dll (1.0.3.0)
         - ref: /Users/sergey/.nuget/packages/fparsec/1.0.3/lib/netstandard1.6/FParsecCS.dll (1.0.3.0)
         - lib: /Users/sergey/.nuget/packages/fake.core.fakevar/5.17.0/lib/netstandard2.0/Fake.Core.FakeVar.dll (5.17.0.0)
         - ref: /Users/sergey/.nuget/packages/fake.core.fakevar/5.17.0/lib/netstandard2.0/Fake.Core.FakeVar.dll (5.17.0.0)
         - lib: /Users/sergey/.nuget/packages/system.threading.threadpool/4.3.0/lib/netstandard1.3/System.Threading.ThreadPool.dll (4.0.11.0)
         - lib: /Users/sergey/.nuget/packages/system.threading/4.3.0/lib/netstandard1.3/System.Threading.dll (4.0.12.0)
         - lib: /Users/sergey/.nuget/packages/system.reflection.metadata/1.7.0/lib/netstandard2.0/System.Reflection.Metadata.dll (1.4.4.0)
         - ref: /Users/sergey/.nuget/packages/system.reflection.metadata/1.7.0/lib/netstandard2.0/System.Reflection.Metadata.dll (1.4.4.0)
         - lib: /Users/sergey/.nuget/packages/system.reactive/4.2.0/lib/netstandard2.0/System.Reactive.dll (4.2.0.0)
         - ref: /Users/sergey/.nuget/packages/system.reactive/4.2.0/lib/netstandard2.0/System.Reactive.dll (4.2.0.0)
         - lib: /Users/sergey/.nuget/packages/fake.core.trace/5.17.0/lib/netstandard2.0/Fake.Core.Trace.dll (5.17.0.0)
         - ref: /Users/sergey/.nuget/packages/fake.core.trace/5.17.0/lib/netstandard2.0/Fake.Core.Trace.dll (5.17.0.0)
         - lib: /Users/sergey/.nuget/packages/fake.core.commandlineparsing/5.17.0/lib/netstandard2.0/Fake.Core.CommandLineParsing.dll (5.17.0.0)
         - ref: /Users/sergey/.nuget/packages/fake.core.commandlineparsing/5.17.0/lib/netstandard2.0/Fake.Core.CommandLineParsing.dll (5.17.0.0)
         - lib: /Users/sergey/.nuget/packages/system.reactive.providers/4.2.0/lib/netstandard2.0/System.Reactive.Providers.dll (3.0.6000.0)
         - ref: /Users/sergey/.nuget/packages/system.reactive.providers/4.2.0/lib/netstandard2.0/System.Reactive.Providers.dll (3.0.6000.0)
         - lib: /Users/sergey/.nuget/packages/system.reactive.platformservices/4.2.0/lib/netstandard2.0/System.Reactive.PlatformServices.dll (3.0.6000.0)
         - ref: /Users/sergey/.nuget/packages/system.reactive.platformservices/4.2.0/lib/netstandard2.0/System.Reactive.PlatformServices.dll (3.0.6000.0)
         - lib: /Users/sergey/.nuget/packages/system.reactive.linq/4.2.0/lib/netstandard2.0/System.Reactive.Linq.dll (3.0.6000.0)
         - ref: /Users/sergey/.nuget/packages/system.reactive.linq/4.2.0/lib/netstandard2.0/System.Reactive.Linq.dll (3.0.6000.0)
         - lib: /Users/sergey/.nuget/packages/system.reactive.interfaces/4.2.0/lib/netstandard2.0/System.Reactive.Interfaces.dll (3.0.6000.0)
         - ref: /Users/sergey/.nuget/packages/system.reactive.interfaces/4.2.0/lib/netstandard2.0/System.Reactive.Interfaces.dll (3.0.6000.0)
         - lib: /Users/sergey/.nuget/packages/system.reactive.core/4.2.0/lib/netstandard2.0/System.Reactive.Core.dll (3.0.6000.0)
         - ref: /Users/sergey/.nuget/packages/system.reactive.core/4.2.0/lib/netstandard2.0/System.Reactive.Core.dll (3.0.6000.0)
         - lib: /Users/sergey/.nuget/packages/fsharp.control.reactive/4.2.0/lib/netstandard2.0/FSharp.Control.Reactive.dll (4.2.0.0)
         - ref: /Users/sergey/.nuget/packages/fsharp.control.reactive/4.2.0/lib/netstandard2.0/FSharp.Control.Reactive.dll (4.2.0.0)
         - lib: /Users/sergey/.nuget/packages/fake.core.tasks/5.17.0/lib/netstandard2.0/Fake.Core.Tasks.dll (5.17.0.0)
         - ref: /Users/sergey/.nuget/packages/fake.core.tasks/5.17.0/lib/netstandard2.0/Fake.Core.Tasks.dll (5.17.0.0)
         - lib: /Users/sergey/.nuget/packages/system.runtime.loader/4.3.0/lib/netstandard1.5/System.Runtime.Loader.dll (4.0.1.0)
         - ref: /Users/sergey/.nuget/packages/system.runtime.loader/4.3.0/ref/netstandard1.5/System.Runtime.Loader.dll (4.0.0.0)
         - lib: /Users/sergey/.nuget/packages/system.threading.overlapped/4.3.0/runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll (4.0.2.0)
         - lib: /Users/sergey/.nuget/packages/system.text.regularexpressions/4.3.1/lib/netstandard1.6/System.Text.RegularExpressions.dll (4.1.1.1)
         - lib: /Users/sergey/.nuget/packages/system.security.cryptography.primitives/4.3.0/lib/netstandard1.3/System.Security.Cryptography.Primitives.dll (4.0.1.0)
         - lib: /Users/sergey/.nuget/packages/system.runtime.serialization.primitives/4.3.0/lib/netstandard1.3/System.Runtime.Serialization.Primitives.dll (4.1.2.0)
         - lib: /Users/sergey/.nuget/packages/system.runtime.numerics/4.3.0/lib/netstandard1.3/System.Runtime.Numerics.dll (4.0.2.0)
         - lib: /Users/sergey/.nuget/packages/system.resources.writer/4.3.0/lib/netstandard1.3/System.Resources.Writer.dll (4.0.1.0)
         - lib: /Users/sergey/.nuget/packages/system.objectmodel/4.3.0/lib/netstandard1.3/System.ObjectModel.dll (4.0.13.0)
         - lib: /Users/sergey/.nuget/packages/system.linq/4.3.0/lib/netstandard1.6/System.Linq.dll (4.1.1.0)
         - lib: /Users/sergey/.nuget/packages/system.globalization.extensions/4.3.0/runtimes/unix/lib/netstandard1.3/System.Globalization.Extensions.dll (4.0.2.0)
         - lib: /Users/sergey/.nuget/packages/system.diagnostics.tracesource/4.3.0/runtimes/unix/lib/netstandard1.3/System.Diagnostics.TraceSource.dll (4.0.1.0)
         - lib: /Users/sergey/.nuget/packages/system.diagnostics.process/4.3.0/runtimes/osx/lib/netstandard1.4/System.Diagnostics.Process.dll (4.1.1.0)
         - lib: /Users/sergey/.nuget/packages/system.diagnostics.fileversioninfo/4.3.0/runtimes/unix/lib/netstandard1.3/System.Diagnostics.FileVersionInfo.dll (4.0.1.0)
         - lib: /Users/sergey/.nuget/packages/system.collections.concurrent/4.3.0/lib/netstandard1.3/System.Collections.Concurrent.dll (4.0.13.0)
         - lib: /Users/sergey/.nuget/packages/system.xml.readerwriter/4.3.1/lib/netstandard1.3/System.Xml.ReaderWriter.dll (4.1.0.0)
         - lib: /Users/sergey/.nuget/packages/system.security.cryptography.encoding/4.3.0/runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll (4.0.1.0)
         - lib: /Users/sergey/.nuget/packages/system.linq.parallel/4.3.0/lib/netstandard1.3/System.Linq.Parallel.dll (4.0.2.0)
         - lib: /Users/sergey/.nuget/packages/system.linq.expressions/4.3.0/lib/netstandard1.6/System.Linq.Expressions.dll (4.1.1.0)
         - lib: /Users/sergey/.nuget/packages/system.io.filesystem.watcher/4.3.0/runtimes/osx/lib/netstandard1.3/System.IO.FileSystem.Watcher.dll (4.0.1.0)
         - lib: /Users/sergey/.nuget/packages/nuget.common/5.3.0/lib/netstandard2.0/NuGet.Common.dll (5.3.0.4)
         - ref: /Users/sergey/.nuget/packages/nuget.common/5.3.0/lib/netstandard2.0/NuGet.Common.dll (5.3.0.4)
         - lib: /Users/sergey/.nuget/packages/microsoft.build.framework/16.3.0/lib/netstandard2.0/Microsoft.Build.Framework.dll (15.1.0.0)
         - ref: /Users/sergey/.nuget/packages/microsoft.build.framework/16.3.0/lib/netstandard2.0/Microsoft.Build.Framework.dll (15.1.0.0)
         - lib: /Users/sergey/.nuget/packages/fake.core.semver/5.17.0/lib/netstandard2.0/Fake.Core.SemVer.dll (5.17.0.0)
         - ref: /Users/sergey/.nuget/packages/fake.core.semver/5.17.0/lib/netstandard2.0/Fake.Core.SemVer.dll (5.17.0.0)
         - lib: /Users/sergey/.nuget/packages/system.xml.xpath/4.3.0/lib/netstandard1.3/System.Xml.XPath.dll (4.0.2.0)
         - lib: /Users/sergey/.nuget/packages/system.xml.xmldocument/4.3.0/lib/netstandard1.3/System.Xml.XmlDocument.dll (4.0.2.0)
         - lib: /Users/sergey/.nuget/packages/system.xml.xdocument/4.3.0/lib/netstandard1.3/System.Xml.XDocument.dll (4.0.12.0)
         - lib: /Users/sergey/.nuget/packages/system.security.cryptography.algorithms/4.3.1/runtimes/osx/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll (4.2.1.1)
         - lib: /Users/sergey/.nuget/packages/system.dynamic.runtime/4.3.0/lib/netstandard1.3/System.Dynamic.Runtime.dll (4.0.12.0)
         - lib: /Users/sergey/.nuget/packages/nuget.configuration/5.3.0/lib/netstandard2.0/NuGet.Configuration.dll (5.3.0.4)
         - ref: /Users/sergey/.nuget/packages/nuget.configuration/5.3.0/lib/netstandard2.0/NuGet.Configuration.dll (5.3.0.4)
         - lib: /Users/sergey/.nuget/packages/microsoft.build.utilities.core/16.3.0/lib/netstandard2.0/Microsoft.Build.Utilities.Core.dll (15.1.0.0)
         - ref: /Users/sergey/.nuget/packages/microsoft.build.utilities.core/16.3.0/lib/netstandard2.0/Microsoft.Build.Utilities.Core.dll (15.1.0.0)
         - lib: /Users/sergey/.nuget/packages/fake.io.filesystem/5.17.0/lib/netstandard2.0/Fake.IO.FileSystem.dll (5.17.0.0)
         - ref: /Users/sergey/.nuget/packages/fake.io.filesystem/5.17.0/lib/netstandard2.0/Fake.IO.FileSystem.dll (5.17.0.0)
         - lib: /Users/sergey/.nuget/packages/system.xml.xpath.xmldocument/4.3.0/lib/netstandard1.3/System.Xml.XPath.XmlDocument.dll (4.0.2.0)
         - ref: /Users/sergey/.nuget/packages/system.xml.xpath.xmldocument/4.3.0/ref/netstandard1.3/System.Xml.XPath.XmlDocument.dll (4.0.2.0)
         - lib: /Users/sergey/.nuget/packages/system.xml.xpath.xdocument/4.3.0/lib/netstandard1.3/System.Xml.XPath.XDocument.dll (4.0.2.0)
         - lib: /Users/sergey/.nuget/packages/system.security.cryptography.csp/4.3.0/runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.Csp.dll (4.0.1.0)
         - lib: /Users/sergey/.nuget/packages/nuget.packaging/5.3.0/lib/netstandard2.0/NuGet.Packaging.dll (5.3.0.4)
         - ref: /Users/sergey/.nuget/packages/nuget.packaging/5.3.0/lib/netstandard2.0/NuGet.Packaging.dll (5.3.0.4)
         - lib: /Users/sergey/.nuget/packages/fsharp.compiler.service/32.0.0/lib/netstandard2.0/FSharp.Compiler.Service.dll (32.0.0.0)
         - ref: /Users/sergey/.nuget/packages/fsharp.compiler.service/32.0.0/lib/netstandard2.0/FSharp.Compiler.Service.dll (32.0.0.0)
         - lib: /Users/sergey/.nuget/packages/fake.core.process/5.17.0/lib/netstandard2.0/Fake.Core.Process.dll (5.17.0.0)
         - ref: /Users/sergey/.nuget/packages/fake.core.process/5.17.0/lib/netstandard2.0/Fake.Core.Process.dll (5.17.0.0)
         - lib: /Users/sergey/.nuget/packages/system.security.cryptography.x509certificates/4.3.2/runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll (4.1.1.2)
         - lib: /Users/sergey/.nuget/packages/nuget.protocol/5.3.0/lib/netstandard2.0/NuGet.Protocol.dll (5.3.0.4)
         - ref: /Users/sergey/.nuget/packages/nuget.protocol/5.3.0/lib/netstandard2.0/NuGet.Protocol.dll (5.3.0.4)
         - lib: /Users/sergey/.nuget/packages/fake.tools.git/5.17.0/lib/netstandard2.0/Fake.Tools.Git.dll (5.17.0.0)
         - ref: /Users/sergey/.nuget/packages/fake.tools.git/5.17.0/lib/netstandard2.0/Fake.Tools.Git.dll (5.17.0.0)
         - lib: /Users/sergey/.nuget/packages/fake.core.xml/5.17.0/lib/netstandard2.0/Fake.Core.Xml.dll (5.17.0.0)
         - ref: /Users/sergey/.nuget/packages/fake.core.xml/5.17.0/lib/netstandard2.0/Fake.Core.Xml.dll (5.17.0.0)
         - lib: /Users/sergey/.nuget/packages/fake.core.target/5.17.0/lib/netstandard2.0/Fake.Core.Target.dll (5.17.0.0)
         - ref: /Users/sergey/.nuget/packages/fake.core.target/5.17.0/lib/netstandard2.0/Fake.Core.Target.dll (5.17.0.0)
         - lib: /Users/sergey/.nuget/packages/system.net.http/4.3.4/runtimes/unix/lib/netstandard1.6/System.Net.Http.dll (4.1.1.3)
         - lib: /Users/sergey/.nuget/packages/microsoft.build.tasks.core/16.3.0/lib/netstandard2.0/Microsoft.Build.Tasks.Core.dll (15.1.0.0)
         - ref: /Users/sergey/.nuget/packages/microsoft.build.tasks.core/16.3.0/lib/netstandard2.0/Microsoft.Build.Tasks.Core.dll (15.1.0.0)
         - lib: /Users/sergey/.nuget/packages/fake.net.http/5.17.0/lib/netstandard2.0/Fake.Net.Http.dll (5.17.0.0)
         - ref: /Users/sergey/.nuget/packages/fake.net.http/5.17.0/lib/netstandard2.0/Fake.Net.Http.dll (5.17.0.0)
         - lib: /Users/sergey/.nuget/packages/msbuild.structuredlogger/2.0.110/lib/netstandard2.0/StructuredLogger.dll (2.0.110.0)
         - ref: /Users/sergey/.nuget/packages/msbuild.structuredlogger/2.0.110/lib/netstandard2.0/StructuredLogger.dll (2.0.110.0)
         - lib: /Users/sergey/.nuget/packages/fake.dotnet.nuget/5.17.0/lib/netstandard2.0/Fake.DotNet.NuGet.dll (5.17.0.0)
         - ref: /Users/sergey/.nuget/packages/fake.dotnet.nuget/5.17.0/lib/netstandard2.0/Fake.DotNet.NuGet.dll (5.17.0.0)
         - lib: /Users/sergey/.nuget/packages/fake.dotnet.msbuild/5.17.0/lib/netstandard2.0/Fake.DotNet.MSBuild.dll (5.17.0.0)
         - ref: /Users/sergey/.nuget/packages/fake.dotnet.msbuild/5.17.0/lib/netstandard2.0/Fake.DotNet.MSBuild.dll (5.17.0.0)
         - lib: /Users/sergey/.nuget/packages/fake.dotnet.fsi/5.17.0/lib/netstandard2.0/Fake.DotNet.Fsi.dll (5.17.0.0)
         - ref: /Users/sergey/.nuget/packages/fake.dotnet.fsi/5.17.0/lib/netstandard2.0/Fake.DotNet.Fsi.dll (5.17.0.0)
         - lib: /Users/sergey/.nuget/packages/fake.dotnet.cli/5.17.0/lib/netstandard2.0/Fake.DotNet.Cli.dll (5.17.0.0)
         - ref: /Users/sergey/.nuget/packages/fake.dotnet.cli/5.17.0/lib/netstandard2.0/Fake.DotNet.Cli.dll (5.17.0.0)
Using cache
Trying to resolve: netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
Redirect assembly load to known assembly: netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 (Some
  "/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.1.13/netstandard.dll")
Trying to resolve: FSharp.Core, Version=4.7.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Redirect assembly load to known assembly: FSharp.Core, Version=4.7.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a (<null>)
Trying to resolve: Fake.Core.Target, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Global resolve event: Fake.Core.Target, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Could not find assembly in the default load-context: Fake.Core.Target, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Redirect assembly load to known assembly: Fake.Core.Target, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null (Some
  "/Users/sergey/.nuget/packages/fake.core.target/5.17.0/lib/netstandard2.0/Fake.Core.Target.dll")
Redirect assembly load to previously loaded assembly: netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
Redirect assembly load to previously loaded assembly: FSharp.Core, Version=4.7.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Trying to resolve: Fake.Core.CommandLineParsing, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Could not find assembly in the default load-context: Fake.Core.CommandLineParsing, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Redirect assembly load to known assembly: Fake.Core.CommandLineParsing, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null (Some
  "/Users/sergey/.nuget/packages/fake.core.commandlineparsing/5.17.0/lib/netstandard2.0/Fake.Core.CommandLineParsing.dll")
Redirect assembly load to previously loaded assembly: netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
Redirect assembly load to previously loaded assembly: FSharp.Core, Version=4.7.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Trying to resolve: Fake.Core.FakeVar, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Global resolve event: Fake.Core.FakeVar, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Could not find assembly in the default load-context: Fake.Core.FakeVar, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Redirect assembly load to known assembly: Fake.Core.FakeVar, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null (Some
  "/Users/sergey/.nuget/packages/fake.core.fakevar/5.17.0/lib/netstandard2.0/Fake.Core.FakeVar.dll")
Redirect assembly load to previously loaded assembly: netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
Redirect assembly load to previously loaded assembly: FSharp.Core, Version=4.7.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Trying to resolve: FParsecCS, Version=1.0.3.0, Culture=neutral, PublicKeyToken=null
Could not find assembly in the default load-context: FParsecCS, Version=1.0.3.0, Culture=neutral, PublicKeyToken=null
Redirect assembly load to known assembly: FParsecCS, Version=1.0.3.0, Culture=neutral, PublicKeyToken=null (Some
  "/Users/sergey/.nuget/packages/fparsec/1.0.3/lib/netstandard1.6/FParsecCS.dll")
Trying to resolve: System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Redirect assembly load to known assembly: System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a (Some
  "/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.1.13/System.Runtime.dll")
Trying to resolve: FParsec, Version=1.0.3.0, Culture=neutral, PublicKeyToken=null
Could not find assembly in the default load-context: FParsec, Version=1.0.3.0, Culture=neutral, PublicKeyToken=null
Redirect assembly load to known assembly: FParsec, Version=1.0.3.0, Culture=neutral, PublicKeyToken=null (Some
  "/Users/sergey/.nuget/packages/fparsec/1.0.3/lib/netstandard1.6/FParsec.dll")
Redirect assembly from 'System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' to previous loaded assembly 'System.Runtime, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
Redirect assembly from 'FSharp.Core, Version=4.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' to previous loaded assembly 'FSharp.Core, Version=4.7.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
Trying to resolve: System.Globalization.Extensions, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Redirect assembly load to known assembly: System.Globalization.Extensions, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a (Some
  "/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.1.13/System.Globalization.Extensions.dll")
Redirect assembly from 'System.Globalization.Extensions, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' to previous loaded assembly 'System.Globalization.Extensions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
Redirect assembly from 'FSharp.Core, Version=4.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' to previous loaded assembly 'FSharp.Core, Version=4.7.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
Redirect assembly from 'System.Runtime, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' to previous loaded assembly 'System.Runtime, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
Trying to resolve: System.Globalization, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Redirect assembly load to known assembly: System.Globalization, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a (Some
  "/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.1.13/System.Globalization.dll")
Trying to resolve: System.Text.Encoding, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Redirect assembly load to known assembly: System.Text.Encoding, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a (Some
  "/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.1.13/System.Text.Encoding.dll")
Trying to resolve: System.IO, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Redirect assembly load to known assembly: System.IO, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a (Some "/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.1.13/System.IO.dll")
Redirect assembly from 'System.Text.Encoding, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' to previous loaded assembly 'System.Text.Encoding, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
Trying to resolve: System.Collections, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Redirect assembly load to known assembly: System.Collections, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a (Some
  "/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.1.13/System.Collections.dll")
Redirect assembly from 'System.Globalization, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' to previous loaded assembly 'System.Globalization, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
Redirect assembly from 'System.Collections, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' to previous loaded assembly 'System.Collections, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
Trying to resolve: Fake.Core.Context, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Redirect assembly load to known assembly: Fake.Core.Context, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null (<null>)
Redirect assembly load to previously loaded assembly: Fake.Core.Context, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Trying to resolve: Fake.Core.Trace, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Global resolve event: Fake.Core.Trace, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Could not find assembly in the default load-context: Fake.Core.Trace, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Redirect assembly load to known assembly: Fake.Core.Trace, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null (Some
  "/Users/sergey/.nuget/packages/fake.core.trace/5.17.0/lib/netstandard2.0/Fake.Core.Trace.dll")
Redirect assembly load to previously loaded assembly: netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
Redirect assembly load to previously loaded assembly: FSharp.Core, Version=4.7.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Trying to resolve: Fake.Core.Environment, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Global resolve event: Fake.Core.Environment, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Could not find assembly in the default load-context: Fake.Core.Environment, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Redirect assembly load to known assembly: Fake.Core.Environment, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null (Some
  "/Users/sergey/.nuget/packages/fake.core.environment/5.17.0/lib/netstandard2.0/Fake.Core.Environment.dll")
Redirect assembly load to previously loaded assembly: netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
Redirect assembly load to previously loaded assembly: FSharp.Core, Version=4.7.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Trying to resolve: System.Reactive, Version=4.2.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263
Global resolve event: System.Reactive, Version=4.2.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263
Could not find assembly in the default load-context: System.Reactive, Version=4.2.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263
Redirect assembly load to known assembly: System.Reactive, Version=4.2.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263 (Some
  "/Users/sergey/.nuget/packages/system.reactive/4.2.0/lib/netstandard2.0/System.Reactive.dll")
Redirect assembly load to previously loaded assembly: netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
Trying to resolve: FSharp.Control.Reactive, Version=4.2.0.0, Culture=neutral, PublicKeyToken=null
Global resolve event: FSharp.Control.Reactive, Version=4.2.0.0, Culture=neutral, PublicKeyToken=null
Could not find assembly in the default load-context: FSharp.Control.Reactive, Version=4.2.0.0, Culture=neutral, PublicKeyToken=null
Redirect assembly load to known assembly: FSharp.Control.Reactive, Version=4.2.0.0, Culture=neutral, PublicKeyToken=null (Some
  "/Users/sergey/.nuget/packages/fsharp.control.reactive/4.2.0/lib/netstandard2.0/FSharp.Control.Reactive.dll")
Redirect assembly load to previously loaded assembly: netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
Redirect assembly from 'FSharp.Core, Version=4.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' to previous loaded assembly 'FSharp.Core, Version=4.7.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
run All
Building project with version: LocalBuild
Shortened DependencyGraph for Target All:
<== All
   <== Run

The running order is:
Group - 1
  - Run
Group - 2
  - All
Starting target 'Run'
Trying to resolve: Fake.Core.Process, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Global resolve event: Fake.Core.Process, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Could not find assembly in the default load-context: Fake.Core.Process, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Redirect assembly load to known assembly: Fake.Core.Process, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null (Some
  "/Users/sergey/.nuget/packages/fake.core.process/5.17.0/lib/netstandard2.0/Fake.Core.Process.dll")
Redirect assembly load to previously loaded assembly: netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
Redirect assembly load to previously loaded assembly: FSharp.Core, Version=4.7.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Trying to resolve: System.Collections.Immutable, Version=1.2.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Redirect assembly load to known assembly: System.Collections.Immutable, Version=1.2.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a (Some
  "/Users/sergey/.nuget/packages/fake-cli/5.17.0/tools/netcoreapp2.1/any/System.Collections.Immutable.dll")
Trying to resolve: Fake.IO.FileSystem, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Global resolve event: Fake.IO.FileSystem, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Could not find assembly in the default load-context: Fake.IO.FileSystem, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
Redirect assembly load to known assembly: Fake.IO.FileSystem, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null (Some
  "/Users/sergey/.nuget/packages/fake.io.filesystem/5.17.0/lib/netstandard2.0/Fake.IO.FileSystem.dll")
Redirect assembly load to previously loaded assembly: netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
Redirect assembly load to previously loaded assembly: FSharp.Core, Version=4.7.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Redirect assembly load to previously loaded assembly: Fake.Core.Context, Version=5.17.0.0, Culture=neutral, PublicKeyToken=null
> "/Library/Frameworks/Mono.framework/Versions/Current/Commands/mono" --version (In: false, Out: true, Err: true)
> "dotnet" fsi ./script.fsx (In: false, Out: false, Err: false)
Finished (Success) 'Run' in 00:00:00.2799785
Starting target 'All'
Finished (Success) 'All' in 00:00:00.0001396

---------------------------------------------------------------------
Build Time Report
---------------------------------------------------------------------
Target     Duration
------     --------
Run        00:00:00.2733163
All        00:00:00.0000578
Total:     00:00:00.3936341
Status:    Ok
---------------------------------------------------------------------
saving cache...
Ready.
Performance:
 - Cli parsing: 294 milliseconds
 - Packages: 143 milliseconds
 - Script analyzing: 49 milliseconds
 - Script running: 773 milliseconds
 - Script cleanup: 17 milliseconds
 - Runtime: 1 second
 sergey@MacBook-Pro-Sergey  ~/github/fake-process-kill   master ●  ;72R0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

@matthid
Copy link
Member

matthid commented Oct 19, 2019

Ok I think I know what happens as I see something similar on Ubuntu (WSL): It seems like dotnet is spawning child-processes and then existing itself, basically escaping the fake logic as we do not handle recursively spawned processes, so I think this is a duplicate of #1427

@sergey-tihon
Copy link
Member Author

sergey-tihon commented Oct 19, 2019

One more strange thing, I modified build script to able test ctrl+c case

Target.create "Run" (fun _ -> 
    CreateProcess.fromRawCommandLine "dotnet" "fsi ./script.fsx"
    |> (Proc.start >> ignore)
)

Target.create "Sleep" (fun _ -> 
    System.Threading.Thread.Sleep(7000)
)
Target.create "All" ignore

"Run" 
  ==> "Sleep"
  ==> "All"

And if I press ctrl-c very quickly (when child process only starting) it kills it
image

@sergey-tihon
Copy link
Member Author

Does it mean that at the moment FAKE does kill all started .NET Core processes on macOS and Linux? Do you know any workaround for this? killall dotnet is too dangerous.

@matthid
Copy link
Member

matthid commented Oct 19, 2019

I can add a more detailed error to see why Ctrl+C fails, but I guess the reason is the same, the process has exited already.

Does it mean that at the moment FAKE does kill all started .NET Core processes on macOS and Linux?

Yes as far as I can see it works as expected

Do you know any workaround for this? killall dotnet is too dangerous.

No the only way is to kill processes including their child, but there is no cross platform way to do it. Maybe https:/aspnet/AspNetCore/blob/master/src/Shared/Process/ProcessExtensions.cs but I don't think that logic works when the parent has already exited.

Note that this also means that

let p = Process.Start("dotnet fsi ./script.fsx")
Thread.Sleep(100)
p.Kill()

will not work either

@matthid
Copy link
Member

matthid commented Oct 19, 2019

This maybe should be reported to the dotnet cli repository, or send a PR for recursive kill (as long as it works cross platform). But at the moment I don't see any actual issue.

I'm not sure what your scenario is but if you use Proc.run instead of start and don't redirect then CTRL+C works as expected as the fsi itself will close.

@matthid matthid closed this as completed Oct 19, 2019
@sergey-tihon
Copy link
Member Author

I know three use cases where I had this issue

Use case 1: SwaggerProvider - test api server

I start server with test api and then I want to compile TP again this server and stop it somehow at the end.

https:/fsprojects/SwaggerProvider/blob/dev/build.fsx#L94-L98

in .net core world on macOS its keep dev server running

Use case 2: Local dev server for documentation dotnet-serve

In FsUnit project I use dotnet-serve to serve compiled documentation site and then FAKE script watch file changes and recompile them incrementally. I also expect that when I kill my fake script it will kill all child processes, but it does not.

https:/fsprojects/FsUnit/blob/master/build.fsx#L236-L237

Use case 3: Bootstrap local dev env

I saw projects that bootstrap local dev environments using FAKE (when you need to start multiple components with specific params) Again, on the macOS when you press Ctrl+C it leave all started components running and from time to time you have to do killall dotnet to stop them.
Yes it also kill and restart your IDE (like Ionide for example) but you do not have another choice when your CPU is too high and laptop already too hot.

@matthid
Copy link
Member

matthid commented Oct 19, 2019

@sergey-tihon Don't get me wrong, I want to get this fixed. But I don't see any way to do it properly. That's why I suggested opening an issue on the SDK side.

If you find a way to kill the processes via regular .NET APIs we can integrate it into FAKE. I'd even accept PInvoke or hacks as long as they do not only consider unix or windows (I expect a PR to work on both)

@matthid
Copy link
Member

matthid commented Oct 20, 2019

Seems like Kill(bool entireProcessTree) was added in netcore 3. Sadly, we compile against netstandard2.0, see https:/dotnet/corefx/pull/34147/files

I guess we would have to backport the implementation, but it looks really really ugly

@matthid
Copy link
Member

matthid commented Oct 20, 2019

Or we update the runner to netcore 3 and call that API via reflection if it exists, this would be a partial solution but probably better than nothing.

@TheAngryByrd
Copy link
Contributor

TheAngryByrd commented Oct 21, 2019

Here's a snippet of what we do in our mac/linux environment to combat this issue:

  let private pipeline filename args =
    CreateProcess.fromRawCommand filename args
    |> CreateProcess.withTimeout (System.TimeSpan.FromSeconds(1.))
    |> CreateProcess.redirectOutput

  let execProcAndReturnMessages filename args =
    pipeline filename args
    |> CreateProcess.ensureExitCode
    |> Proc.run

  let pgrep args = Process.execProcAndReturnMessages "pgrep" args
  let kill args  = Process.execProcAndReturnMessages "kill"  args

  let killTerm  processId = kill ["-TERM"; string processId]

  let rec getAllChildIdsUnix parentId =
      let result = pgrep [sprintf "-P %d" parentId]

      if
          result.Messages()
          |> Seq.isEmpty
      then
          [parentId]
          |> Seq.ofList
      else
          parentId
          :: (
              result.Messages()
              |> Seq.toList
              // |> Seq.cache
              |> Seq.choose(
                  fun text ->
                      match System.Int32.TryParse(text) with
                      | (true, v) -> Some v
                      | _         -> None )
          |> Seq.collect (getAllChildIdsUnix)
          |> Seq.toList)
          |> Seq.ofList

  let killChildrenAndProcess _timeout parentId =
      getAllChildIdsUnix parentId
      |> Seq.rev
      |> Seq.iter (killTerm >> ignore)

yes it relies on pgrep and kill so you'd have to to some detection of these tools but it works pretty well for us.

@matthid
Copy link
Member

matthid commented Oct 21, 2019

Maybe you can send a PR and somebody else can work on the windows side? This is actually pretty similar to what I linked above.

@TheAngryByrd
Copy link
Contributor

TheAngryByrd commented Oct 21, 2019

Yeah it's a port of that dotnet core code from a long while ago

@matthid
Copy link
Member

matthid commented Oct 21, 2019

Now we need the windows side and a PR ;)

@github-actions
Copy link
Contributor

There has not been any activity in this issue for the last 3 months so it will be closed in 14 days if there is no activity.

@Zaid-Ajaj
Copy link

@matthid Can you please re-open the issue

Seems like Kill(bool entireProcessTree) was added in netcore 3. Sadly, we compile against netstandard2.0, see https:/dotnet/corefx/pull/34147/files

Isn't FAKE currently a dotnet CLI tool published targetting netcoreapp3.1? Maybe it is possible to add this parameter now

@matthid
Copy link
Member

matthid commented Oct 28, 2020

@Zaid-Ajaj I'm not a fan of keeping issues open just for the sake of it. While the cli tool have been updated we still use netstandard2.0 assemblies at runtime (because fake depends on the standard not on the concrete implementation). This is just the way things work at the moment. I feel like there isn't much value to invest in netcoreapp3 given that net5 shifts everything again. So the logical step would be to invest time to upgrade everything to net5 (which hasn't a stable release yet)...

In any case just as I have written above I'd like to get this fixed and would likely accept a PR, given that the implementation is robust and cross platform. I hope that clears things up.

@Zaid-Ajaj
Copy link

That's fair enough, thanks for the quick answer :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants