Я ищу решение, которое вызывает мою сборку FAKE script, когда я делаю "Build Solution" (Ctrl + F6). Бонусные точки для указания цели, отличной от стандартной.
Как я могу заставить Visual Studio использовать FAKE для создания моего решения?
Ответ 1
Ближайшим, который я нашел до сих пор, является определение FAKE в качестве внешнего инструмента через
Tools -> External tools...
Установите для использования окна вывода и для запроса аргументов. Затем определите сочетание клавиш с помощью
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"