-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathHelpers.fs
131 lines (89 loc) · 3.65 KB
/
Helpers.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
module Helpers
open Fake.Core
let initializeContext () =
let execContext = Context.FakeExecutionContext.Create false "Build.fs" []
Context.setExecutionContext (Context.RuntimeContext.Fake execContext)
module Proc =
module Parallel =
open System
let locker = obj ()
let colors =
[|
ConsoleColor.Blue
ConsoleColor.Yellow
ConsoleColor.Magenta
ConsoleColor.Cyan
ConsoleColor.DarkBlue
ConsoleColor.DarkYellow
ConsoleColor.DarkMagenta
ConsoleColor.DarkCyan
|]
let print color (colored: string) (line: string) =
lock locker (fun () ->
let currentColor = Console.ForegroundColor
Console.ForegroundColor <- color
Console.Write colored
Console.ForegroundColor <- currentColor
Console.WriteLine line)
let onStdout index name (line: string) =
let color = colors[index % colors.Length]
if isNull line then
print color $"{name}: --- END ---" ""
else if String.isNotNullOrEmpty line then
print color $"{name}: " line
let onStderr name (line: string) =
let color = ConsoleColor.Red
if isNull line |> not then
print color $"{name}: " line
let redirect (index, (name, createProcess)) =
createProcess
|> CreateProcess.redirectOutputIfNotRedirected
|> CreateProcess.withOutputEvents (onStdout index name) (onStderr name)
let printStarting indexed =
for index, (name, c: CreateProcess<_>) in indexed do
let color = colors[index % colors.Length]
let wd = c.WorkingDirectory |> Option.defaultValue ""
let exe = c.Command.Executable
let args = c.Command.Arguments.ToStartInfo
print color $"{name}: {wd}> {exe} {args}" ""
let run cs =
cs
|> Seq.toArray
|> Array.indexed
|> fun x ->
printStarting x
x
|> Array.map redirect
|> Array.Parallel.map Proc.run
let createProcess exe args dir =
// Use `fromRawCommand` rather than `fromRawCommandLine`, as its behaviour is less likely to be misunderstood.
// See https://github.com/SAFE-Stack/SAFE-template/issues/551.
CreateProcess.fromRawCommand exe args
|> CreateProcess.withWorkingDirectory dir
|> CreateProcess.ensureExitCode
let dotnet args dir = createProcess "dotnet" args dir
let docker args dir = createProcess "docker" args dir
let createProcessFromPath processName args dir =
let path =
match ProcessUtils.tryFindFileOnPath processName with
| Some path -> path
| None ->
"npm was not found in path. Please install it and make sure it's available from your path. "
+ "See https://safe-stack.github.io/docs/quickstart/#install-pre-requisites for more info"
|> failwith
createProcess path args dir
let npm args dir = createProcessFromPath "npm" args dir
let npx args dir = createProcessFromPath "npx" args dir
let run proc arg dir = proc arg dir |> Proc.run |> ignore
let runParallel processes =
processes |> Proc.Parallel.run |> ignore
let runOrDefault args =
try
match args with
| [| list |] when list = "list" -> Target.listAvailable ()
| [| target |] -> Target.runOrDefault target
| _ -> Target.runOrDefault "Run"
0
with e ->
printfn $"%A{e}"
1