我怎样才能让 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 文件,诀窍在于有条件地覆盖内置 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>
接下来,在每个 *.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"
我正在寻找一种解决方案,当我执行 "Build Solution" (Ctrl + F6) 时,它会调用我的 FAKE 构建脚本。指定默认目标以外的目标的方法的奖励积分。
到目前为止我发现最接近的是通过
将FAKE定义为外部工具 Tools -> External tools...
将其设置为使用输出 window 并提示输入参数。然后,通过
定义键盘快捷键 Tools -> Options -> Environment -> Keyboard -> Tools.ExternalCommand6
当您调用它时,您可以提供一个目标或只需按回车键来构建默认值。
我用另一种方式解决了这个问题。它需要手动编辑 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>
接下来,在每个 *.csproj
项目文件的 <Project />
部分的底部,我添加了:
<PropertyGroup>
<FakeTargetsPath>..\Targets\fake.targets</FakeTargetsPath>
</PropertyGroup>
<Import Project="$(FakeTargetsPath)" Condition="Exists($(FakeTargetsPath)) And '$(RealBuild)'!='true'" />
注意: FakeTargetsPath
是相对于csproj
文件的。
最后一步是创建 build.fsx
,它使用 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"