我刚刚开始使用FAKE.我真的很喜欢这个主意.在教程中,设置构建和部署目录.
// Directories
let buildDir = "./build/"
let testDir = "./test/"
let deployDir = "./deploy/"
Run Code Online (Sandbox Code Playgroud)
然后引用那些很好的,但是可以将其作为参数传递吗?也许作为我可以在以后使用它的任务?
我是.NET生态系统的新手,我正在使用来自Java-land的F#.我正试图围绕工具和构建过程.
我的理解是MSBuild是.NET应用程序的构建工具,它的构建配置是在.sln和/或.*proj文件中用XML定义的.假设这类似于java中的pom.xml或build.gradle文件,我是否正确?
无论如何,如果MSBuild是构建工具,那么FAKE到底是什么?什么可以做那个MSBuild不能做到的?它只是围绕MSBuild配置文件更友好的"包装器"吗?
我看到了一个名为Ionide和F#开源环境的视频,其中主要的演示者提供了一个原因.至少在VSCode中仍然需要.*proj文件.以下不是直接引用,但接近结尾,他说的是
在与编译器通信和使代码工作方面,根本不需要MSBuild系统.我们无法将它拉出来的唯一原因是因为F#编译器服务 - 提供工具提示信息,某种类型的类型检查等 - 取决于项目文件,但我们正在努力扩展它以便它可以使用不同类型的格式.
我正在尝试使用以下命令Fake
从官方站点安装(在站点提供):
dotnet tool install fake-cli -g
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
No executable found matching command "dotnet-tool"
Run Code Online (Sandbox Code Playgroud)
我的dotnet版本是2.1.201
,我正在运行Windows 10 Professional,包含所有最新更新.
在FAKE中,您通常有一个buildcript,如:
// "foo.fsx"
#r @"./packages/tools/FAKE/tools/FakeLib.dll"
open Fake
Target "Foo" (fun _ -> trace "Here I am, foo the size of a bar" )
Run "Foo"
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.现在假设你想要另一个名为"bar.fsx"的buildcript,
// "bar.fsx"
#r @"./packages/tools/FAKE/tools/FakeLib.dll"
#load "foo.fsx"
open Fake
Target "Bar" (fun _ -> trace "And you have me building software ..." )
Run "Bar"
Run Code Online (Sandbox Code Playgroud)
现在这是错误的.如果您尝试运行"bar.fsx",它将首先执行任务"Foo",即使我没有明确要求将其作为依赖项.这是因为该load
指令运行foo.fsx
脚本.
所以,我的问题是,如何导入foo.fsx
文件,获取所有目标,但不执行说Run
命令.或者更有趣的是,我真正想做的事情; 如何Target
在FAKE中的脚本之间共享?
如果我将Target
定义放入模块中,它就没有用,如下所示:
module FooTargets =
Target "Foo" (fun _ -> trace "Here I am, …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种解决方案,当我执行"构建解决方案"(Ctrl + F6)时调用我的FAKE构建脚本.奖励指向指定默认目标以外的目标的方式.
我在我的FAKE脚本中有一个错误代码中的错误,我与遗留构建基础设施接口.我有一个错误,我想在Visual Studio中调试我的脚本.我使用--break
flag来附加Visual Studio 2013调试器,我可以设置一个断点.但我无法检查任何FAKE脚本的变量.
有没有办法使用Visual Studio 2013调试器来检查FAKE脚本的状态?常规F#程序似乎没有问题.
在VS中,Build(incremental)和Rebuild之间通常有区别,后者首先要清理,然后像Build一样.我能用FAKE提供类似的行为吗?
我们假设以下目标:
Target "Clean" DoNothing
Target "Work" DoNothing
Target "All" DoNothing
RunTargetOrDefault "All"
Run Code Online (Sandbox Code Playgroud)
通常我想运行所有这些,在工作前清洁,所以我最终得到:
"Clean" ==> "Work" ==> "All"
Run Code Online (Sandbox Code Playgroud)
但是,Work并不是真正依赖Clean - 只有两者都要运行时才能运行Clean.使用上面的依赖链,我无法运行Work而不首先运行Clean.是否有方法或共同模式来支持这一点?
到目前为止我考虑过的事情:
一个)
"Clean" ==> "All"
"Work" ==> "All"
Run Code Online (Sandbox Code Playgroud)
这正确地表示了All的依赖关系,但是在工作之前清理应该是的顺序 - 如果两者都运行 - 都缺失了.
B)
Target "WorkOnly" DoNothing
"WorkOnly" ==> "Work"
"Clean" ==> "Work" ==> "All"
Run Code Online (Sandbox Code Playgroud)
这有点接近,但它仍然无法保证在WorkOnly之前构建All that Clean将运行
C)
Target "Start" DoNothing
"Start"
=?> ("Clean", not (hasBuildParam "noclean"))
==> "Work"
==> "All"
Run Code Online (Sandbox Code Playgroud)
这样,除非我指定"noclean"作为参数,否则Clean将始终运行.这似乎完全支持我的场景,实际上非常灵活,但如果有多个可选阶段,可能会有点复杂.
这是预期的方式以及其他人如何做到这一点,还是我错过了一些明显的东西?
在Fake构建自动化工具中执行Powershell脚本的最佳方法是什么?
我觉得这个问题应该有一个明显的答案,但是通过搜索找不到任何东西.
我想从MSBuild切换到FAKE.在我的MSBuild脚本中,我通过调用具有DeployOnBuild = True和DeployTarget = Package属性的MSBuild来创建Webdeploy包.这将触发webdeploy在构建运行时生成部署包:
<MSBuild Projects="@(ItemToBuild)"
Targets="Build"
Properties="Configuration=$(Configuration);
Platform=$(Platform);
DeployOnBuild=True;
DeployTarget=Package;
OutFolder=$(OutFolder)" />
Run Code Online (Sandbox Code Playgroud)
我怎么能用FAKE做同样的事情?我走到这一步:
Target "Build" (fun _ ->
!! solutionFile
|> MSBuildRelease binDir "Build"
|> Log "Build-Output: "
)
Run Code Online (Sandbox Code Playgroud)
如何指定所需的属性?