From cfd47003afd4f407ab60f687000606059bcab43d Mon Sep 17 00:00:00 2001 From: Jimmy Byrd Date: Sun, 2 Apr 2017 21:13:17 -0400 Subject: [PATCH] New project layout --- .gitignore | 5 + .paket/Paket.Restore.targets | 42 +++++++ .paket/paket.bootstrapper.exe | Bin 0 -> 49664 bytes .paket/paket.exe.config | 6 + .paket/paket.targets | 62 ++++++++++ RELEASE_NOTES.md | 2 + build.fsx | 101 ++++++++++++++++ build.sh | 79 +++++++++++++ example/Program.fs | 17 ++- example/example.fsproj | 3 +- paket.dependencies | 5 + paket.lock | 6 + src/dotnet-mono/Helpers.fs | 177 +++++++++++++++++++++++++++++ src/dotnet-mono/Program.fs | 177 +---------------------------- src/dotnet-mono/dotnet-mono.fsproj | 17 ++- 15 files changed, 512 insertions(+), 187 deletions(-) create mode 100644 .paket/Paket.Restore.targets create mode 100644 .paket/paket.bootstrapper.exe create mode 100644 .paket/paket.exe.config create mode 100644 .paket/paket.targets create mode 100644 RELEASE_NOTES.md create mode 100644 build.fsx create mode 100755 build.sh create mode 100644 paket.dependencies create mode 100644 paket.lock create mode 100644 src/dotnet-mono/Helpers.fs diff --git a/.gitignore b/.gitignore index f1e3d20..0fdeefd 100644 --- a/.gitignore +++ b/.gitignore @@ -152,6 +152,7 @@ PublishScripts/ # NuGet Packages *.nupkg +packages/ # The packages folder can be ignored because of Package Restore **/packages/* # except build/, which is used as an MSBuild target. @@ -250,3 +251,7 @@ paket-files/ # JetBrains Rider .idea/ *.sln.iml + +TestResults.xml + +dist/ \ No newline at end of file diff --git a/.paket/Paket.Restore.targets b/.paket/Paket.Restore.targets new file mode 100644 index 0000000..87814bb --- /dev/null +++ b/.paket/Paket.Restore.targets @@ -0,0 +1,42 @@ + + + + true + $(MSBuildThisFileDirectory) + /Library/Frameworks/Mono.framework/Commands/mono + mono + + $(PaketRootPath)paket.exe + $(PaketToolsPath)paket.exe + "$(PaketExePath)" + $(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)" + + + + + + + + $(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).references + + + + + + + + + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[0]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[1]) + + + %(PaketReferencesFileLinesInfo.PackageVersion) + + + + + $(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).NuGet.Config + + + + \ No newline at end of file diff --git a/.paket/paket.bootstrapper.exe b/.paket/paket.bootstrapper.exe new file mode 100644 index 0000000000000000000000000000000000000000..a463d17d32fdd708a85499e4e51934e947a2182e GIT binary patch literal 49664 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 KH&P#r*z6yo;Z(^0 literal 0 HcmV?d00001 diff --git a/.paket/paket.exe.config b/.paket/paket.exe.config new file mode 100644 index 0000000..2fc733f --- /dev/null +++ b/.paket/paket.exe.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.paket/paket.targets b/.paket/paket.targets new file mode 100644 index 0000000..30d74f7 --- /dev/null +++ b/.paket/paket.targets @@ -0,0 +1,62 @@ + + + + + + true + $(MSBuildThisFileDirectory) + $(MSBuildThisFileDirectory)..\ + /Library/Frameworks/Mono.framework/Commands/mono + mono + + + + + $(PaketRootPath)paket.exe + $(PaketToolsPath)paket.exe + "$(PaketExePath)" + $(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)" + + + + + + $(MSBuildProjectFullPath).paket.references + + + + + $(MSBuildProjectDirectory)\$(MSBuildProjectName).paket.references + + + + + $(MSBuildProjectDirectory)\paket.references + + + + + + + + + + + + $(MSBuildProjectDirectory)\$(MSBuildProjectName).paket.references + $(MSBuildProjectDirectory)\paket.references + $(MSBuildStartupDirectory)\paket.references + $(MSBuildProjectFullPath).paket.references + $(PaketCommand) restore --references-files "$(PaketReferences)" + + RestorePackages; $(BuildDependsOn); + + + + + diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md new file mode 100644 index 0000000..bffd3f3 --- /dev/null +++ b/RELEASE_NOTES.md @@ -0,0 +1,2 @@ +#### 0.1.0 - 2.04.2017 +* Initial release \ No newline at end of file diff --git a/build.fsx b/build.fsx new file mode 100644 index 0000000..371e6f6 --- /dev/null +++ b/build.fsx @@ -0,0 +1,101 @@ +#r @"packages/build/FAKE/tools/FakeLib.dll" +open Fake +open Fake.Git +open Fake.AssemblyInfoFile +open Fake.ReleaseNotesHelper +open Fake.UserInputHelper +open System + +#if MONO +let inferFrameworkPathOverride () = + let mscorlib = "mscorlib.dll" + let possibleFrameworkPaths = + [ + "/Library/Frameworks/Mono.framework/Versions/Current/lib/mono/4.5/" + "/usr/local/Cellar/mono/4.6.12/lib/mono/4.5/" + "/usr/lib/mono/4.5/" + ] + + possibleFrameworkPaths + |> Seq.find (fun p ->IO.File.Exists(p @@ mscorlib)) + +Environment.SetEnvironmentVariable("FrameworkPathOverride", inferFrameworkPathOverride ()) +#endif +let release = LoadReleaseNotes "RELEASE_NOTES.md" +let srcGlob = "src/**/*.fsproj" +let testsGlob = "tests/**/*.fsproj" + +Target "Clean" (fun _ -> + ["bin"; "temp" ;"dist"] + |> CleanDirs + + !! srcGlob + ++ testsGlob + |> Seq.collect(fun p -> + ["bin";"obj"] + |> Seq.map(fun sp -> + IO.Path.GetDirectoryName p @@ sp) + ) + |> CleanDirs + + ) + +Target "DotnetRestore" (fun _ -> + !! srcGlob + ++ testsGlob + |> Seq.iter (fun proj -> + DotNetCli.Restore (fun c -> + { c with + Project = proj + }) +)) + +Target "DotnetBuild" (fun _ -> + !! srcGlob + |> Seq.iter (fun proj -> + DotNetCli.Build (fun c -> + { c with + Project = proj + }) +)) + +Target "DotnetTest" (fun _ -> + !! testsGlob + |> Seq.iter (fun proj -> + DotNetCli.Test (fun c -> + { c with + Project = proj + WorkingDir = IO.Path.GetDirectoryName proj + }) +)) + +Target "DotnetPack" (fun _ -> + !! srcGlob + |> Seq.iter (fun proj -> + DotNetCli.Pack (fun c -> + { c with + Project = proj + Configuration = "Release" + OutputPath = IO.Directory.GetCurrentDirectory() @@ "dist" + AdditionalArgs = [sprintf "/p:PackageVersion=%s" release.NugetVersion] + }) + ) +) + +Target "Publish" (fun _ -> + Paket.Push(fun c -> + { c with + PublishUrl = "https://www.nuget.org" + WorkingDir = "dist" + } + ) +) + +"Clean" + ==> "DotnetRestore" + ==> "DotnetBuild" + ==> "DotnetTest" + ==> "DotnetPack" + ==> "Publish" + +RunTargetOrDefault "DotnetPack" \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..593644f --- /dev/null +++ b/build.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash + +set -eu + +cd "$(dirname "$0")" + +PAKET_BOOTSTRAPPER_EXE=.paket/paket.bootstrapper.exe +PAKET_EXE=.paket/paket.exe +FAKE_EXE=packages/build/FAKE/tools/FAKE.exe + +FSIARGS="" +FSIARGS2="" +OS=${OS:-"unknown"} + +echo $OSTYPE +if [ "$OS" != "Windows_NT" ] +then + # Can't use FSIARGS="--fsiargs -d:MONO" in zsh, so split it up + # (Can't use arrays since dash can't handle them) + FSIARGS="--fsiargs" + FSIARGS2="-d:MONO" +fi + +run() { + if [ "$OS" != "Windows_NT" ] + then + mono "$@" + else + "$@" + fi +} + +yesno() { + # NOTE: Defaults to NO + read -p "$1 [y/N] " ynresult + case "$ynresult" in + [yY]*) true ;; + *) false ;; + esac +} + +set +e +run $PAKET_BOOTSTRAPPER_EXE +bootstrapper_exitcode=$? +set -e + +if [ "$OS" != "Windows_NT" ] && + [ $bootstrapper_exitcode -ne 0 ] && + [ $(certmgr -list -c Trust | grep X.509 | wc -l) -le 1 ] && + [ $(certmgr -list -c -m Trust | grep X.509 | wc -l) -le 1 ] +then + echo "Your Mono installation has no trusted SSL root certificates set up." + echo "This may result in the Paket bootstrapper failing to download Paket" + echo "because Github's SSL certificate can't be verified. One way to fix" + echo "this issue would be to download the list of SSL root certificates" + echo "from the Mozilla project by running the following command:" + echo "" + echo " mozroots --import --sync" + echo "" + echo "This will import over 100 SSL root certificates into your Mono" + echo "certificate repository." + echo "" + if yesno "Run 'mozroots --import --sync' now?" + then + mozroots --import --sync + else + echo "Attempting to continue without running mozroots. This might fail." + fi + # Re-run bootstrapper whether or not the user ran mozroots, because maybe + # they fixed the problem in a separate terminal window. + run $PAKET_BOOTSTRAPPER_EXE +fi + +run $PAKET_EXE restore + +[ ! -e build.fsx ] && run $PAKET_EXE update +[ ! -e build.fsx ] && run $FAKE_EXE init.fsx +run $FAKE_EXE "$@" $FSIARGS $FSIARGS2 build.fsx + diff --git a/example/Program.fs b/example/Program.fs index 0cfeb7c..f58a582 100755 --- a/example/Program.fs +++ b/example/Program.fs @@ -1,12 +1,23 @@ // Learn more about F# at http://fsharp.org open System +open Suave +open Suave.Filters +open Suave.Operators +open Suave.Successful [] let main argv = + if Type.GetType("Mono.Runtime") <> null then - printfn "Hello World from F#! on mono" + printfn "Hello World from F# on mono" + elif Type.GetType("System.Runtime.Loader.AssemblyLoadContext, System.Runtime.Loader") <> null then + printfn "Hello World from F# on core" else - printfn "Hello World from F#! on core?" - //Threading.Thread.Sleep(100000) + printfn "Hello World from F# on full" + let app = + choose [ + OK "Hello World!" + ] + startWebServer defaultConfig app 0 // return an integer exit code diff --git a/example/example.fsproj b/example/example.fsproj index b0997d6..af31839 100755 --- a/example/example.fsproj +++ b/example/example.fsproj @@ -7,8 +7,9 @@ + - + diff --git a/paket.dependencies b/paket.dependencies new file mode 100644 index 0000000..75802af --- /dev/null +++ b/paket.dependencies @@ -0,0 +1,5 @@ +source https://www.nuget.org/api/v2 + +group Build + source https://www.nuget.org/api/v2 + nuget FAKE \ No newline at end of file diff --git a/paket.lock b/paket.lock new file mode 100644 index 0000000..40f1367 --- /dev/null +++ b/paket.lock @@ -0,0 +1,6 @@ + + +GROUP Build +NUGET + remote: https://www.nuget.org/api/v2 + FAKE (4.56) diff --git a/src/dotnet-mono/Helpers.fs b/src/dotnet-mono/Helpers.fs new file mode 100644 index 0000000..c379396 --- /dev/null +++ b/src/dotnet-mono/Helpers.fs @@ -0,0 +1,177 @@ +namespace DotnetMono +open System +open System.Linq +open System.Collections +open System.Collections.Concurrent +open System.Collections.Generic +open System.Diagnostics +open System.IO +open System.Text +open Argu + +module Environment = + let getEnvironmentVariable = + Environment.GetEnvironmentVariable + >> Option.ofObj +//Thanks FAKE +module Shell = + type internal ConcurrentBag<'T> with + member internal this.Clear() = + while not(this.IsEmpty) do + this.TryTake() |> ignore + let startedProcesses = ConcurrentBag() + + let isNullOrEmpty str = + String.IsNullOrEmpty(str) + + type ProcessResult = + { ExitCode : int + Messages : List + Errors : List } + member x.OK = x.ExitCode = 0 + static member New exitCode messages errors = + { ExitCode = exitCode + Messages = messages + Errors = errors } + + let kill (proc : Process) = + printfn "Trying to kill process %s (Id = %d)" proc.ProcessName proc.Id + try + proc.Kill() + with exn -> printfn "Could not kill process %s (Id = %d).%sMessage: %s" proc.ProcessName proc.Id Environment.NewLine exn.Message + + let killAllCreatedProcesses() = + + let traced = ref false + + for pid, startTime in startedProcesses do + try + let proc = Process.GetProcessById pid + + // process IDs may be reused by the operating system so we need + // to make sure the process is indeed the one we started + if proc.StartTime = startTime && not proc.HasExited then + try + if not !traced then + printfn "%s" "Killing all processes that are created by dotnet-mono and are still running." + traced := true + + printfn "Trying to kill %s" proc.ProcessName + kill proc + with exn -> printfn "Killing %s failed with %s" proc.ProcessName exn.Message + with exn -> () + startedProcesses.Clear() + let start (proc : Process) = + try + System.Console.OutputEncoding <- System.Text.Encoding.UTF8 + with exn -> + printfn "Failed setting UTF8 console encoding, ignoring error... %s." exn.Message + + if proc.StartInfo.FileName.ToLowerInvariant().EndsWith(".exe") then + proc.StartInfo.Arguments <- "--debug \"" + proc.StartInfo.FileName + "\" " + proc.StartInfo.Arguments + proc.StartInfo.FileName <- "mono" + proc.Start() |> ignore + startedProcesses.Add(proc.Id, proc.StartTime) |> ignore + let ExecProcessWithLambdas configProcessStartInfoF (timeOut : TimeSpan) silent errorF messageF = + use proc = new Process() + proc.StartInfo.UseShellExecute <- false + configProcessStartInfoF proc.StartInfo + if isNullOrEmpty proc.StartInfo.WorkingDirectory |> not then + if Directory.Exists proc.StartInfo.WorkingDirectory |> not then + failwithf "Start of process %s failed. WorkingDir %s does not exist." proc.StartInfo.FileName + proc.StartInfo.WorkingDirectory + if silent then + proc.StartInfo.StandardOutputEncoding <- Encoding.UTF8 + proc.StartInfo.StandardErrorEncoding <- Encoding.UTF8 + proc.ErrorDataReceived.Add(fun d -> + if d.Data <> null then errorF d.Data) + proc.OutputDataReceived.Add(fun d -> + if d.Data <> null then messageF d.Data) + proc.StartInfo.RedirectStandardOutput <- true + proc.StartInfo.RedirectStandardError <- true + proc |> start + proc.BeginOutputReadLine() + proc.BeginErrorReadLine() + + + if timeOut = TimeSpan.MaxValue then proc.WaitForExit() + else + if not <| proc.WaitForExit(int timeOut.TotalMilliseconds) then + try + proc.Kill() + with exn -> + eprintfn "%A" + <| sprintf "Could not kill process %s %s after timeout." proc.StartInfo.FileName + proc.StartInfo.Arguments + failwithf "Process %s %s timed out." proc.StartInfo.FileName proc.StartInfo.Arguments + // See http://stackoverflow.com/a/16095658/1149924 why WaitForExit must be called twice. + proc.WaitForExit() + proc.ExitCode + + + let ExecProcessAndReturnMessages configProcessStartInfoF timeOut = + let errors = new List<_>() + let messages = new List<_>() + let exitCode = ExecProcessWithLambdas configProcessStartInfoF timeOut true (errors.Add) (messages.Add) + ProcessResult.New exitCode messages errors + + let executeOrFail (program : string) (argsList : string list) workingdir envVars= + let args = + argsList + |> String.concat " " + let psi = + ProcessStartInfo( + FileName = program, + Arguments = args, + //UseShellExecute = false, + WorkingDirectory = workingdir) + envVars + |> Seq.iter(fun (kvp : DictionaryEntry) -> + try + psi.Environment.Add(kvp.Key |> string,kvp.Value |> string) + with _ -> () + ) + let proc = Process.Start(psi) + proc.WaitForExit() + if proc.ExitCode <> 0 then + failwithf "%s failed with exit code %d" program proc.ExitCode + + let dotnet args = + executeOrFail "dotnet" args null + + let dotnetRestore args = + dotnet ("restore" :: args) + let dotnetBuild args = + dotnet ("build" :: args) + + let mono workingDir options program programOptions = + executeOrFail + "mono" + [ + options + program + programOptions + ] + workingDir + let (@@) path1 path2 = IO.Path.Combine(path1,path2) + let inferFrameworkPathOverride () = + let mscorlib = "mscorlib.dll" + let possibleFrameworkPaths = + [ + "/Library/Frameworks/Mono.framework/Versions/4.6.2/lib/mono/4.5/" + "/usr/local/Cellar/mono/4.6.2.16/lib/mono/4.5/" + "/usr/lib/mono/4.5/" + ] + possibleFrameworkPaths + |> Seq.tryFind (fun p ->File.Exists(p @@ mscorlib)) + let inferRuntime () = + let procResult = + ExecProcessAndReturnMessages + (fun psi -> + psi.FileName <- "dotnet" + psi.Arguments <- "--info") + TimeSpan.MaxValue + procResult.Messages + |> Seq.filter(fun s -> s.Contains("RID")) + |> Seq.head + |> fun s -> s.Replace("RID:","").Trim() diff --git a/src/dotnet-mono/Program.fs b/src/dotnet-mono/Program.fs index 28cdd7b..87bdb99 100755 --- a/src/dotnet-mono/Program.fs +++ b/src/dotnet-mono/Program.fs @@ -1,5 +1,4 @@ -// Learn more about F# at http://fsharp.org - +namespace DotnetMono open System open System.Linq open System.Collections @@ -10,176 +9,8 @@ open System.IO open System.Text open System.Runtime.Loader open Argu -module Environment = - let getEnvironmentVariable = - Environment.GetEnvironmentVariable - >> Option.ofObj -//Thanks FAKE -module Shell = - type internal ConcurrentBag<'T> with - member internal this.Clear() = - while not(this.IsEmpty) do - this.TryTake() |> ignore - let startedProcesses = ConcurrentBag() - - let isNullOrEmpty str = - String.IsNullOrEmpty(str) - - type ProcessResult = - { ExitCode : int - Messages : List - Errors : List } - member x.OK = x.ExitCode = 0 - static member New exitCode messages errors = - { ExitCode = exitCode - Messages = messages - Errors = errors } - - let kill (proc : Process) = - printfn "Trying to kill process %s (Id = %d)" proc.ProcessName proc.Id - try - proc.Kill() - with exn -> printfn "Could not kill process %s (Id = %d).%sMessage: %s" proc.ProcessName proc.Id Environment.NewLine exn.Message - - let killAllCreatedProcesses() = - - let traced = ref false - - for pid, startTime in startedProcesses do - try - let proc = Process.GetProcessById pid - - // process IDs may be reused by the operating system so we need - // to make sure the process is indeed the one we started - if proc.StartTime = startTime && not proc.HasExited then - try - if not !traced then - printfn "%s" "Killing all processes that are created by dotnet-mono and are still running." - traced := true - - printfn "Trying to kill %s" proc.ProcessName - kill proc - with exn -> printfn "Killing %s failed with %s" proc.ProcessName exn.Message - with exn -> () - startedProcesses.Clear() - let start (proc : Process) = - try - System.Console.OutputEncoding <- System.Text.Encoding.UTF8 - with exn -> - printfn "Failed setting UTF8 console encoding, ignoring error... %s." exn.Message - - if proc.StartInfo.FileName.ToLowerInvariant().EndsWith(".exe") then - proc.StartInfo.Arguments <- "--debug \"" + proc.StartInfo.FileName + "\" " + proc.StartInfo.Arguments - proc.StartInfo.FileName <- "mono" - proc.Start() |> ignore - startedProcesses.Add(proc.Id, proc.StartTime) |> ignore - let ExecProcessWithLambdas configProcessStartInfoF (timeOut : TimeSpan) silent errorF messageF = - use proc = new Process() - proc.StartInfo.UseShellExecute <- false - configProcessStartInfoF proc.StartInfo - if isNullOrEmpty proc.StartInfo.WorkingDirectory |> not then - if Directory.Exists proc.StartInfo.WorkingDirectory |> not then - failwithf "Start of process %s failed. WorkingDir %s does not exist." proc.StartInfo.FileName - proc.StartInfo.WorkingDirectory - if silent then - proc.StartInfo.StandardOutputEncoding <- Encoding.UTF8 - proc.StartInfo.StandardErrorEncoding <- Encoding.UTF8 - proc.ErrorDataReceived.Add(fun d -> - if d.Data <> null then errorF d.Data) - proc.OutputDataReceived.Add(fun d -> - if d.Data <> null then messageF d.Data) - proc.StartInfo.RedirectStandardOutput <- true - proc.StartInfo.RedirectStandardError <- true - proc |> start - proc.BeginOutputReadLine() - proc.BeginErrorReadLine() - - - if timeOut = TimeSpan.MaxValue then proc.WaitForExit() - else - if not <| proc.WaitForExit(int timeOut.TotalMilliseconds) then - try - proc.Kill() - with exn -> - eprintfn "%A" - <| sprintf "Could not kill process %s %s after timeout." proc.StartInfo.FileName - proc.StartInfo.Arguments - failwithf "Process %s %s timed out." proc.StartInfo.FileName proc.StartInfo.Arguments - // See http://stackoverflow.com/a/16095658/1149924 why WaitForExit must be called twice. - proc.WaitForExit() - proc.ExitCode - - - let ExecProcessAndReturnMessages configProcessStartInfoF timeOut = - let errors = new List<_>() - let messages = new List<_>() - let exitCode = ExecProcessWithLambdas configProcessStartInfoF timeOut true (errors.Add) (messages.Add) - ProcessResult.New exitCode messages errors - - let executeOrFail (program : string) (argsList : string list) workingdir envVars= - let args = - argsList - |> String.concat " " - let psi = - ProcessStartInfo( - FileName = program, - Arguments = args, - //UseShellExecute = false, - WorkingDirectory = workingdir) - envVars - |> Seq.iter(fun (kvp : DictionaryEntry) -> - try - psi.Environment.Add(kvp.Key |> string,kvp.Value |> string) - with _ -> () - ) - let proc = Process.Start(psi) - proc.WaitForExit() - if proc.ExitCode <> 0 then - failwithf "%s failed with exit code %d" program proc.ExitCode - - let dotnet args = - executeOrFail "dotnet" args null - - let dotnetRestore args = - dotnet ("restore" :: args) - let dotnetBuild args = - dotnet ("build" :: args) - - let mono workingDir options program programOptions = - executeOrFail - "mono" - [ - options - program - programOptions - ] - workingDir - let (@@) path1 path2 = IO.Path.Combine(path1,path2) - let inferFrameworkPathOverride () = - let mscorlib = "mscorlib.dll" - let possibleFrameworkPaths = - [ - "/Library/Frameworks/Mono.framework/Versions/4.6.2/lib/mono/4.5/" - "/usr/local/Cellar/mono/4.6.2.16/lib/mono/4.5/" - "/usr/lib/mono/4.5/" - ] - possibleFrameworkPaths - |> Seq.tryFind (fun p ->File.Exists(p @@ mscorlib)) - let inferRuntime () = - let procResult = - ExecProcessAndReturnMessages - (fun psi -> - psi.FileName <- "dotnet" - psi.Arguments <- "--info") - TimeSpan.MaxValue - procResult.Messages - |> Seq.filter(fun s -> s.Contains("RID")) - |> Seq.head - |> fun s -> s.Replace("RID:","").Trim() - +open Shell module Main = - open Shell - type CLIArguments = | [] Project of project:string | [] Framework of framework:string @@ -237,11 +68,11 @@ module Main = [] let main argv = Console.CancelKeyPress.Add(fun _ -> - printfn "%s closing up" "dotnet-mono" + // printfn "%s closing up" "dotnet-mono" Shell.killAllCreatedProcesses() ) AssemblyLoadContext.Default.add_Unloading(fun ctx -> - printfn "%s closing up" "dotnet-mono" + // printfn "%s closing up" "dotnet-mono" Shell.killAllCreatedProcesses() ) diff --git a/src/dotnet-mono/dotnet-mono.fsproj b/src/dotnet-mono/dotnet-mono.fsproj index caae0b3..8422fb0 100755 --- a/src/dotnet-mono/dotnet-mono.fsproj +++ b/src/dotnet-mono/dotnet-mono.fsproj @@ -2,23 +2,20 @@ Exe - dotnet-mono netcoreapp1.0 - 0.1.0-alpha009 - + + - - - - + + - - + + - +