-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathbuild.fsx
143 lines (109 loc) · 3.69 KB
/
build.fsx
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
132
133
134
135
136
137
138
139
140
141
142
143
#r "paket: groupref build //"
#load "./.fake/build.fsx/intellisense.fsx"
#if !FAKE
#r "netstandard"
#r "Facades/netstandard" // https://github.com/ionide/ionide-vscode-fsharp/issues/839#issuecomment-396296095
#endif
open System
open Fake.Core
open Fake.DotNet
open Fake.IO
open Fake.IO.FileSystemOperators
Target.initEnvironment ()
let serverPath = Path.getFullName "./src/Server"
let gamePath = Path.getFullName "./src/Game"
let joinPath = Path.getFullName "./src/Join"
let clientDeployPath = Path.combine gamePath "deploy"
let deployDir = Path.getFullName "./deploy"
let bin = deployDir </> "bin"
let pub = deployDir </> "public"
let release = ReleaseNotes.load "RELEASE_NOTES.md"
let platformTool tool winTool =
let tool = if Environment.isUnix then tool else winTool
match ProcessUtils.tryFindFileOnPath tool with
| Some t -> t
| _ ->
let errorMsg =
tool + " 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 errorMsg
let nodeTool = platformTool "node" "node.exe"
let yarnTool = platformTool "yarn" "yarn.cmd"
let runTool cmd args workingDir =
let arguments = args |> String.split ' ' |> Arguments.OfArgs
Command.RawCommand (cmd, arguments)
|> CreateProcess.fromCommand
|> CreateProcess.withWorkingDirectory workingDir
|> CreateProcess.ensureExitCode
|> Proc.run
|> ignore
let runDotNet cmd workingDir =
let result =
DotNet.exec (DotNet.Options.withWorkingDirectory workingDir) cmd ""
if result.ExitCode <> 0 then failwithf "'dotnet %s' failed in %s" cmd workingDir
let openBrowser url =
//https://github.com/dotnet/corefx/issues/10361
Command.ShellCommand url
|> CreateProcess.fromCommand
|> CreateProcess.ensureExitCodeWithMessage "opening browser failed"
|> Proc.run
|> ignore
Target.create "Clean" (fun _ ->
[ deployDir
clientDeployPath ]
|> Shell.cleanDirs
)
Target.create "InstallClient" (fun _ ->
printfn "Node version:"
runTool nodeTool "--version" __SOURCE_DIRECTORY__
printfn "Yarn version:"
runTool yarnTool "--version" __SOURCE_DIRECTORY__
runTool yarnTool "install --frozen-lockfile" __SOURCE_DIRECTORY__
)
Target.create "Build" (fun _ ->
runDotNet "build" serverPath
Shell.regexReplaceInFileWithEncoding
"let app = \".+\""
("let app = \"" + release.NugetVersion + "\"")
System.Text.Encoding.UTF8
(Path.combine gamePath "Version.fs")
runTool yarnTool "webpack-cli -p" __SOURCE_DIRECTORY__
DotNet.publish (fun p ->
{ p with
Configuration = DotNet.BuildConfiguration.Release
OutputPath = Some bin
}) "crazy.sln"
Directory.ensure pub
Shell.copyDir pub clientDeployPath (fun _ -> true) |> ignore
)
Target.create "Run" (fun _ ->
let server = async {
runDotNet "watch run" serverPath
}
let client = async {
runTool yarnTool "webpack-dev-server" __SOURCE_DIRECTORY__
}
let browser = async {
do! Async.Sleep 5000
openBrowser "http://localhost:8080"
}
let vsCodeSession = Environment.hasEnvironVar "vsCodeSession"
let safeClientOnly = Environment.hasEnvironVar "safeClientOnly"
let tasks =
[ if not safeClientOnly then yield server
yield client
if not vsCodeSession then yield browser ]
tasks
|> Async.Parallel
|> Async.RunSynchronously
|> ignore
)
open Fake.Core.TargetOperators
"Clean"
==> "InstallClient"
==> "Build"
"Clean"
==> "InstallClient"
==> "Run"
Target.runOrDefaultWithArguments "Build"