2015-03-08 2 views
1

Я пишу ПОДДЕЛЬНЫЙ скрипт, который будет в основном выполнять следующие операции: -Как я параметризация и повторить шаг сборки

1. Clean build outputs 
2. Modify a configuration file with a specific value. 
3. Perform a build. 
4. Upload the outputs somewhere. 

я написал все индивидуальные задания. Теперь мне нужно установить набор шагов сборки FAKE, чтобы по существу повторить вышеуказанные шаги один раз для каждого значения конфигурации, например. предположим, что файл конфигурации имеет атрибут «цвет». Я хочу повторить вышеупомянутые четыре этапа сборки, и на шаге 2 используйте одно из значений [ "black"; "blue"; "red"; "white" ].

Каков наилучший способ достижения этого? Должен ли я просто сделать одну большую задачу сборки, которая делает все это в одном, например. для цикла (кажется неправильным)? Или создать несколько шагов сборки, например. «Настроить конфигурацию на синий» и «Установить конфигурацию на красный» и т. Д. И повторить весь поток сборки для каждого цвета (опять же, кажется неправильным)?

ответ

0

Способ, которым я это сделал, заключается в том, чтобы в принципе написать вспомогательную функцию, которая генерирует цели - как и зависимость от шаблона, - а также генерирует несколько экземпляров «общих» целей; каждый из них отличается от имени элемента переменной, например.

let targets = 
    [ "Blue: Clean" 
    "Blue: Modify Config" 
    "Blue: Perform Build" 
    "Blue: Upload outputs" 
    "Red: Clean" 
    "Red: Modify Config" 
    "Red: Perform Build" 
    "Red: Upload outputs" 
    "Yellow: Clean" 
    "Yellow: Modify Config" 
    "Yellow: Perform Build" 
    "Yellow: Upload outputs" ] 

Затем вы можете легко построить последовательную цепочку зависимостей, например.

targets |> List.reduce (==>) 

Хотя это не совсем то, что я надеялся, она работает достаточно хорошо для меня и позволяет мне видеть через поддельные, где вещи.

0

Можете ли вы использовать различные конфигурации? Например:

BlueBuild:

[configsection] 
    [Color]Blue[/Color] 
[/configsection] 

RedBuild:

[configsection] 
    [Color]Red[/Color] 
[/configsection] 

Смотрите следующие статьи: How to select different app.config for several build configurations

http://www.hanselman.com/blog/managingmultipleconfigurationfileenvironmentswithprebuildevents.aspx

+0

Конфигурация слов, вероятно, не самый лучший выбор. Я имел в виду лишь какой-то произвольный механизм, который изменит процесс сборки Fake. Это не так много общего с app.config и т. Д. –

1

Вы можете сделать это, как это

#r "tools/FAKE/tools/FakeLib.dll" 
open Fake 


Target "Clean" (fun _ -> 
    trace "Cleaning stuff..." 
) 

let config color = ignore() 

Target "ConfigBlack" (fun _ -> 
    config "black" 
) 

Target "ConfigRed" (fun _ -> 
    config "red" 
) 

Target "Build" (fun _ -> 
    trace "Build solution" 
) 

Target "Upload" (fun _ -> 
    trace "Upload artifacts" 
) 


"Clean" 
    =?> ("ConfigBlack",hasBuildParam "black") 
    =?> ("ConfigRed",hasBuildParam "red") 
    ==> "Build" 
    ==> "Upload" 

Run "Upload" 

После того, что вы будете в состоянии назвать в этом, как build Upload black или build Upload red

+0

Это не совсем то, что я хотел бы - в этом случае мне пришлось бы называть '' 'build''' несколько раз, один раз для каждого цвета. Я бы предпочел, чтобы все шаги сборки были в одной цепочке. –

1

Скрипт ниже работает, но использует ExecutedTargets, которые я не думаю, что вы должны использовать.

#I "tools/FAKE/tools" 
#r "FakeLib.dll" 

open Fake 

let mutable value = "Foo" 

Target "Clean" (fun _ -> 
    trace "clean target" 
) 

Target "Modify config file" (fun _ -> 
    trace (sprintf "===========> Modify config file: '%s'" value) 
) 

Target "Perform build" (fun _ -> 
    trace "Perform build" 
) 

Target "Default" (fun _ ->()) 

"Clean" 
    ==> "Modify config file" 
    ==> "Perform build" 
    ==> "Default" 

["black"; "blue"; "red"; "white"] 
|> List.iter(fun v -> 
    value <- v 
    Run <| getBuildParamOrDefault "target" "Default" 
    ExecutedTargets.Clear() 
) 
+0

ОК, это что-то вроде того, что я пробовал до сих пор, кроме того, что я не знал о '' 'ExecutedTargets.Clear()' ''.Я полагаю, что в заключительном отчете о строительстве я бы не увидел все, что произошло? –

+0

Да, это все, но вы получите 4 отчета о времени сборки (по крайней мере, в консоли). – Lazydev

2

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

Я добавлю некоторые документы.

+0

+1 - Я заметил их, но не смог найти документы на них. В настоящее время то, что я делаю, программно создает одну цель для каждого параметра конфигурации, а затем вручную подключает их. Но каждая цель делает «все» внутри него, например. Clean, Config, Upload и т. Д. –

+0

Я добавил образец к http://fsharp.github.io/FAKE/apidocs/fake-targethelper.html – forki23

+0

OK - У меня будет игра с этим. И вернитесь к вам :-) –

Смежные вопросы