如何让Visual Studio使用FAKE构建我的解决方案?

14

我正在寻找一种解决方案,当我执行“构建解决方案”(Ctrl + F6)时调用我的FAKE构建脚本。如果有一种指定目标而不是默认目标的方式,那就更好了。


我没有直接的答案,但是Paket有一个paket.targets文件(https://github.com/fsprojects/Paket/blob/68969d970bf2d60fb4e280e4365b6f87b9a7e285/.paket/paket.targets),当构建解决方案时运行Paket(基本上通过运行可执行文件)。我相信你可以为FAKE做同样的事情 - 但编写MS Build XML代码会很痛苦... - Tomas Petricek
后构建事件?https://dev59.com/NXI_5IYBdhLWcg3wMf5_#1491413 - Mark Seemann
1
我已经研究了Paket是如何做到这一点的:他们使用BuildDependsOn,但这对于FAKE脚本不起作用。 FAKE“Build”目标执行自身的MSBuild任务,会递归触发FAKE脚本。我还没有找到一个合适的方法来使这个工作得很好。 - GeorgS
2个回答

8

我用另一种方法解决了这个问题。它需要手动编辑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文件的。

最后一步是创建一个调用带有RealBuild = true的MSBuild的build.fsx文件:

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

非常有趣。如果使用RealBuild选项会产生什么效果? - villasv

6
迄今为止,我找到的最接近的方法是通过定义FAKE作为外部工具来实现。
 Tools -> External tools...

ExternalTool

将其设置为使用输出窗口并提示输入参数。然后,通过以下方式定义键盘快捷键:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接