如何将此MSBuild脚本转换为F#/ FAKE?

时间:2019-04-01 12:06:06

标签: f# msbuild f#-fake

以下MSBuild脚本到F#/ FAKE的翻译是什么?

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup>
        <CurrentMode>None</CurrentMode>
    </PropertyGroup>

    <Target Name="Compile_A">
        <Message Text="Hello from Compile_A" />

        <CallTarget Targets="SetToA"/>
        <CallTarget Targets="IntermediateStage"/>
    </Target>

    <Target Name="Compile_B">
        <Message Text="Hello from Compile_B" />

        <CallTarget Targets="SetToB"/>
        <CallTarget Targets="IntermediateStage"/>
    </Target>

    <Target Name="IntermediateStage">
        <Message Text="Hello from IntermediateStage" />

        <CallTarget Targets="Compile"/>
    </Target>

    <Target Name="Compile">
        <Message Text="Hello from Compile. I'm using $(CurrentMode)" />
    </Target>

    <!-- The following Targets are only necessary due to a MSBuild bug (CallTarget and CreateProperty cannot be combined) -->
    <Target Name="SetToA">
        <CreateProperty Value="A">
            <Output TaskParameter="Value" PropertyName="CurrentMode" />
        </CreateProperty>
    </Target>

    <Target Name="SetToB">
        <CreateProperty Value="B">
            <Output TaskParameter="Value" PropertyName="CurrentMode" />
        </CreateProperty>
    </Target>
</Project>

我的主要目标是在具有不同值的最高目标(CurrentModeAB中)设置属性,并将其用于最深目标({{1} }。

1 个答案:

答案 0 :(得分:3)

最佳答案可能会根据您的实际情况而有所不同。特别是,如果您不打算单独运行它们,则可能甚至不需要为过程的不同步骤使用单独的目标(在这种情况下,只需使用将模式作为参数并从{{1 }}和CompileA可以正常工作。)

但是,如果要为所有步骤保留单独的目标,则可以执行以下操作:

CompileB

此方法使用由#load ".fake/build.fsx/intellisense.fsx" open Fake.Core open Fake.Core.TargetOperators let mutable CurrentMode = "None" Target.create "SetA" (fun _ -> CurrentMode <- "A" ) Target.create "SetB" (fun _ -> CurrentMode <- "B" ) Target.create "IntermediateStage" (fun _ -> printfn "In the intermediate stage" ) Target.create "Compile" (fun _ -> printfn "Compiling using mode %s" CurrentMode ) Target.create "CompileA" ignore Target.create "CompileB" ignore "SetA" ==> "CompileA" "SetB" ==> "CompileB" "IntermediateStage" ==> "Compile" ==> "CompileA" "IntermediateStage" ==> "Compile" ==> "CompileB" "SetA" ?=> "IntermediateStage" "SetB" ?=> "IntermediateStage" Target.runOrDefault "CompileA" CurrentMode目标设置的可变变量SetA(可以说,它不是很实用,但是可以捕获您的工作)。

使用SetB指定目标之间的依赖关系。请注意,==>必须先于SetA(对于B类似)发生,并且CompileA必须先于IntermediateStage之前,这是两种编译的先决条件。

有一个巧妙的技巧-Compile不需要SetASetB,因为那样F​​AKE会以不确定的顺序运行。 IntermediateStep操作者可让您指定软件依赖项,这表示如果要同时执行?=>IntermediateStep,则必须首先执行SetA -因此,最后两行不是在添加依赖项,而是在明确显示顺序。