我怎样才能让 Visual Studio 使用 FAKE 来构建我的解决方案?

How can I get Visual Studio to use FAKE for building my solution?

我正在寻找一种解决方案,当我执行 "Build Solution" (Ctrl + F6) 时,它会调用我的 FAKE 构建脚本。指定默认目标以外的目标的方法的奖励积分。

到目前为止我发现最接近的是通过

将FAKE定义为外部工具
 Tools -> External tools...

将其设置为使用输出 window 并提示输入参数。然后,通过

定义键盘快捷键
 Tools -> Options -> Environment -> Keyboard -> Tools.ExternalCommand6

当您调用它时,您可以提供一个目标或只需按回车键来构建默认值。

我用另一种方式解决了这个问题。它需要手动编辑 csproj 文件,诀窍在于有条件地覆盖内置 BuildCleanRebuild 目标。

首先,我创建了自定义 fake.targets 文件并将其保存在解决方案级别的 Targets 文件夹中:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Build">
    <Exec Command="packages\FAKE\tools\FAKE.exe build.fsx Build proj=$(ProjectPath) conf=$(Configuration) plat=$(Platform)" WorkingDirectory="..\" />
  </Target>

  <Target Name="Rebuild">
    <Exec Command="packages\FAKE\tools\FAKE.exe build.fsx Rebuild proj=$(ProjectPath) conf=$(Configuration) plat=$(Platform)" WorkingDirectory="..\" />
  </Target>

  <Target Name="Clean">
    <Exec Command="packages\FAKE\tools\FAKE.exe build.fsx Clean proj=$(ProjectPath) conf=$(Configuration) plat=$(Platform)" WorkingDirectory="..\" />
  </Target>
</Project>

接下来,在每个 *.csproj 项目文件的 <Project /> 部分的底部,我添加了:

<PropertyGroup>
  <FakeTargetsPath>..\Targets\fake.targets</FakeTargetsPath>
</PropertyGroup>
<Import Project="$(FakeTargetsPath)" Condition="Exists($(FakeTargetsPath)) And '$(RealBuild)'!='true'" />

注意: FakeTargetsPath是相对于csproj文件的。

最后一步是创建 build.fsx,它使用 RealBuild = true:

调用 MSBuild
#r @"packages/FAKE/tools/FakeLib.dll"
open Fake

let solution = "solution.sln"

let commonBuild target =
    let project = getBuildParamOrDefault "proj" solution
    let configuration = getBuildParamOrDefault "conf" "Release"
    let platform = getBuildParamOrDefault "plat" "AnyCPU"
    let setParams defaults =
        { defaults with
            Verbosity = Some(Quiet)
            Targets = [ target ]
            Properties =
                [
                    "Configuration", configuration
                    "Platform", platform
                    "RealBuild", "true"
                ]
        }

    build setParams project

Target "Build" (fun _ ->
    commonBuild "Build"
)

Target "Clean" (fun _ ->
    commonBuild "Clean"
)

Target "Rebuild" (fun _ ->
    commonBuild "Rebuild"
)

RunTargetOrDefault "Build"