F # Как реализовать параметризованный CI - цикл выполнения с использованием FAKE - PullRequest
0 голосов
/ 29 декабря 2018

Вопрос в основном о шаге № 3.

Мне нужно реализовать следующий цикл в F #:

  1. Загрузить некоторые входные параметры из базы данных.Если входные параметры указывают, что цикл должен быть завершен, то выход.Это просто, благодаря поставщикам типов.

  2. Запустите генератор моделей, который генерирует один исходный файл F #, назовите его ModelData.fs.Генерация основана на входных параметрах и некоторых случайных значениях.Это может занять до нескольких часов.У меня это уже есть.

  3. Скомпилируйте проект. Я могу жестко закодировать вызов MSBuild, но это не так .

  4. Копировать исполняемые файлы во временную папку, скажем, <SomeTempData>\<SomeModelName>.

  5. Асинхронный запуск исполняемого файла из выходного расположения предыдущего шага.Время выполнения обычно составляет от нескольких часов до нескольких дней.Каждый процесс выполняется в одном потоке, потому что в этом случае это наиболее эффективный способ.Я попробовал параллельную версию, но она не побила однопоточную.

  6. Поймать по окончании выполнения.Это кажется простым: https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.exited?view=netframework-4.7.2.Процесс выполнения отвечает за сохранение полезных результатов, если таковые имеются.Это событие может быть обработано F # MailBoxProcessor.

  7. Повторить с начала.Поскольку выполнение является асинхронным, следите за количеством запущенных задач, чтобы убедиться, что оно не превышает допустимое число.Опять же, MailBoxProcessor сделает это с легкостью.

  8. Все это будет работать на 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
---------------------------------------------------------------------
...