Вопрос в основном о шаге № 3.
Мне нужно реализовать следующий цикл в F #:
Загрузить некоторые входные параметры из базы данных.Если входные параметры указывают, что цикл должен быть завершен, то выход.Это просто, благодаря поставщикам типов.
Запустите генератор моделей, который генерирует один исходный файл F #, назовите его ModelData.fs
.Генерация основана на входных параметрах и некоторых случайных значениях.Это может занять до нескольких часов.У меня это уже есть.
Скомпилируйте проект. Я могу жестко закодировать вызов MSBuild, но это не так .
Копировать исполняемые файлы во временную папку, скажем, <SomeTempData>\<SomeModelName>
.
Асинхронный запуск исполняемого файла из выходного расположения предыдущего шага.Время выполнения обычно составляет от нескольких часов до нескольких дней.Каждый процесс выполняется в одном потоке, потому что в этом случае это наиболее эффективный способ.Я попробовал параллельную версию, но она не побила однопоточную.
Поймать по окончании выполнения.Это кажется простым: https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.exited?view=netframework-4.7.2.Процесс выполнения отвечает за сохранение полезных результатов, если таковые имеются.Это событие может быть обработано F # MailBoxProcessor.
Повторить с начала.Поскольку выполнение является асинхронным, следите за количеством запущенных задач, чтобы убедиться, что оно не превышает допустимое число.Опять же, MailBoxProcessor сделает это с легкостью.
Все это будет работать на Windows, поэтому нет необходимости поддерживать несколько платформ.Просто NET Framework (скажем, 4.7.2 на эту дату) подойдет.
Это похоже на очень простое CI-подобное упражнение, и F # FAKE выглядел как правильное решение.К сожалению, ни один из предоставленных скудных примеров не сработал (даже с разумными изменениями), и ошибки были загадочными.Тем не менее, хуже всего было то, что функция компиляции не работала вообще.Приведенный пример: http://fake.build/fake-gettingstarted.html#Compiling-the-application не может быть запущен вообще, и даже после учета чего-то подобного: https://github.com/fsharp/FAKE/issues/1579: он все еще молча выбирает не компилировать проект.Буду признателен за любой совет.
Вот код, который я пытался запустить.Он основан на ссылках выше:
#r @"C:\GitHub\ClmFSharp\Clm\packages\FAKE.5.8.4\tools\FakeLib.dll"
#r @"C:\GitHub\ClmFSharp\Clm\packages\FAKE.5.8.4\tools\System.Reactive.dll"
open System.IO
open Fake.DotNet
open Fake.Core
open Fake.IO
open Fake.IO.Globbing.Operators
let execContext = Fake.Core.Context.FakeExecutionContext.Create false "build.fsx" []
Fake.Core.Context.setExecutionContext (Fake.Core.Context.RuntimeContext.Fake execContext)
// Properties
let buildDir = @"C:\Temp\WTF\"
// Targets
Target.create "Clean" (fun _ ->
Shell.cleanDir buildDir
)
Target.create "BuildApp" (fun _ ->
!! @"..\SolverRunner\SolverRunner.fsproj"
|> MSBuild.runRelease id buildDir "Build"
|> Trace.logItems "AppBuild-Output: "
)
Target.create "Default" (fun _ ->
Trace.trace "Hello World from FAKE"
)
open Fake.Core.TargetOperators
"Clean"
==> "BuildApp"
==> "Default"
Target.runOrDefault "Default"
Проблема в том, что он вообще не создает проект, но сообщения об ошибках не выдаются!Это вывод при запуске в FSI:
run Default
Building project with version: LocalBuild
Shortened DependencyGraph for Target Default:
<== Default
<== BuildApp
<== Clean
The running order is:
Group - 1
- Clean
Group - 2
- BuildApp
Group - 3
- Default
Starting target 'Clean'
Finished (Success) 'Clean' in 00:00:00.0098793
Starting target 'BuildApp'
Finished (Success) 'BuildApp' in 00:00:00.0259223
Starting target 'Default'
Hello World from FAKE
Finished (Success) 'Default' in 00:00:00.0004329
---------------------------------------------------------------------
Build Time Report
---------------------------------------------------------------------
Target Duration
------ --------
Clean 00:00:00.0025260
BuildApp 00:00:00.0258713
Default 00:00:00.0003934
Total: 00:00:00.2985910
Status: Ok
---------------------------------------------------------------------