Как я могу заставить Visual Studio использовать FAKE для создания моего решения?

Я ищу решение, которое вызывает мою сборку FAKE script, когда я делаю "Build Solution" (Ctrl + F6). Бонусные точки для указания цели, отличной от стандартной.

Ответ 1

Ближайшим, который я нашел до сих пор, является определение FAKE в качестве внешнего инструмента через

 Tools -> External tools...

ExternalTool

Установите для использования окна вывода и для запроса аргументов. Затем определите сочетание клавиш с помощью

 Tools -> Options -> Environment -> Keyboard -> Tools.ExternalCommand6

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

Ответ 2

Я решил эту проблему по-другому. Он требует ручного редактирования файлов csproj, и трюк находится в условном переопределении встроенных целей Build, Clean и Rebuild.

Сначала я создал собственный файл 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>

Далее, в нижней части раздела <Project /> в каждом файле проекта *.csproj я добавил:

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

Примечание. FakeTargetsPath относится к файлу csproj.

Последний шаг состоял в создании build.fsx, который вызывает MSBuild с помощью RealBuild = true:

#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"