以下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>
我的主要目标是在具有不同值的最高目标(CurrentMode
是A
或B
中)设置属性,并将其用于最深目标({{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
不需要SetA
和SetB
,因为那样FAKE会以不确定的顺序运行。 IntermediateStep
操作者可让您指定软件依赖项,这表示如果要同时执行?=>
和IntermediateStep
,则必须首先执行SetA
-因此,最后两行不是在添加依赖项,而是在明确显示顺序。