Sunday, 14. February 2010
Feb 14
Last week I released version 0.29 of my build automation tool “FAKE – F# Make”. The new version comes along with a couple of changes which I will now describe.
F# February 2010 CTP and .NET 4.0 RC
“FAKE – F# Make” should be completely compatible with both, the F# February 2010 CTP and the F# version which is included in Visual Studio 2010 RC.
FAKE self build and binaries on teamcity.codebetter.com
Since “FAKE – F# Make” is a build automation tool, it was always used for it’s own build process. Now this build process could be moved to an open CI server at teamcity.codebetter.com. If you login as a guest you can download the latest “FAKE – F# Make” binaries from there.
FAKE on build servers without F#
With the new F# CTP there is no longer a need for installing F# on the build agents. In fact FAKE itself was built on build agents which don’t have a F# installation.
If you want to create such build scripts you have to do the following:
- Download the standalone zip file of the F# CTP
- Put the bin subfolder into your project tree
- Modify the FSIPath value in the FAKE.exe.config file to match your FSharp bin folder
- If you copy the contents the F# bin folder into ./tools/FSharp/ it should just work.
If you have F# projects you also need to modify your .fsproj files like this:
<PropertyGroup>
….
<FscToolPath>..\..\..\tools\FSharp\</FscToolPath>
</PropertyGroup>
…
<Import Project="..\..\..\tools\FSharp\Microsoft.FSharp.Targets" />
This modifications should take care that MSBuild will use the F# compiler from your tools paths.
Generate your documentations with “docu”
“What’s a docu? A documentation generator for .Net that isn’t complicated, awkward, or difficult to use. Given an assembly and the XML that’s generated by Visual Studio, docu can produce an entire website of documentation with a single command.” [docu Homepage]
“FAKE – F# Make” 0.29 is bundled with this new documentation tool which can easily convert your xml-Documentation into some nice html pages. You can use the tool with the new Docu task like this:
Target? GenerateDocumentation <-
fun _ ->
Docu (fun p ->
{p with
ToolPath = @".\tools\FAKE\docu.exe"
TemplatesPath = @".\tools\FAKE\templates"
OutputPath = docDir })
(buildDir + "MyAssembly.dll")
You will also need the docu templates, which you can download from the product homepage. I’m planning to bundle some basic templates with the next version of FAKE.
What’s next?
At the moment I’m working on ILMerge task for FAKE. I hope to release this with the next version. There are also some open issues with the Mono support but since teamcity.codebetter.com is getting a mono build agent I hope to make some progress here too.
If you have any questions or ideas for new features please contact me.
Tags:
Continuous Integration,
F#,
F-sharp Make
Monday, 8. February 2010
Feb 08
The new version 0.27 of “FAKE – F# Make” comes with new syntactic sugar for build targets and build dependencies. Don’t be afraid the old version is still supported – all scripts should still work with the new version.
The problem
Consider the following target definition:
let buildDir = "./build/"
Target "Clean" (fun _ ->
CleanDir buildDir
)
Target "Default" (fun _ ->
trace "Hello World from FAKE"
)
"Default" <== ["Clean"]
run "Default"
As you can see we are having a lot of “magic strings” for the target names and the dependency definitions. This was always a small shortcoming in FAKE, since this doesn’t allow refactoring and may result in runtime errors.
One of my goals for “FAKE – F# Make” is to remove these strings in future versions. Unfortunately this is not that easy, because it causes a lot of internal issues. In particular logging to the build server is much harder if you don’t have a target name.
The first step
As posted in a bitbucket comment by cipher we could use the “dynamic lookup operator” to remove some of the magic strings without breaking any internal code.
As a result we can rewrite the above sample as:
let buildDir = "./build/"
Target? Clean <-
fun _ -> CleanDir buildDir
Target? Default <-
fun _ -> trace "Hello World from FAKE"
For? Default <- Dependency? Clean
Run? Default
All magic strings suddenly disappeared. I think this syntax looks really nice, but unfortunately the strings are not really gone, since the token Default is only checked at runtime.
The idea for future versions
Since the new syntax is really just syntactic sugar I’m always interested in a better solution. Currently I’m working on a syntax using monads. The result could look like this:
let buildDir = "./build/"
let Clean = target { CleanDir buildDir }
let Default =
target {
trace "Hello World from FAKE"
trace "Another line"
}
Default <== [Clean]
This way the magic string are really gone, but my current problem is retrieving the target name from the let-binding name. Please leave a comment if you have an idea to solve this issue.
Tags:
F#,
F-sharp Make,
Fake
Sunday, 18. October 2009
Oct 18
Yesterday I released “FAKE – F# Make” version 0.14 with xUnit.net support. The usage is very easy and similar to the usage of NUnit:
Target "xUnitTest" (fun () ->
let testAssemblies =
!+ (testDir + @"\Test.*.dll")
|> Scan
xUnit
(fun p ->
{p with
ShadowCopy = false;
HtmlPrefix = testDir})
testAssemblies
)
This sample works perfectly with TeamCity and creates a html-page per test project in addition:


If you want to publish the xUnit.net test results in CruiseControl.NET just modify the build script a little:
Target "xUnitTest" (fun () ->
let testAssemblies =
!+ (testDir + @"\Test.*.dll")
|> Scan
xUnit
(fun p ->
{p with
ShadowCopy = false;
HtmlPrefix = testDir;
XmlPrefix = testDir })
testAssemblies
)
Now follow the steps in the CrusieControl.NET documentation. You will need to download the xUnitSummary.xsl file and save it to your webdashboard directory. If everything works correctly you should see something like this:

Tags:
CruiseControl.NET,
F#,
F-sharp Make,
Fake,
nunit,
xUnit.net. TeamCity
Wednesday, 14. October 2009
Oct 14
Since version 0.12 the FAKE build system provides an easy way to setup build configurations for CruiseControl.NET.
“CruiseControl.NET is an Automated Continuous Integration server, implemented using the Microsoft .NET Framework.”
[thoughtworks.org]
In this article I will show you how you can set up a FAKE build script in CruiseControl.NET. We will use the CalculatorSample which you can download from the FAKE Download page.
If you want to know how this build script works and how you could create one for your own projects please read the “Getting started with FAKE”-tutorial.
If you want to set up “FAKE – F# Make” build configurations in TeamCity please read “Integrating a "FAKE – F# Make" build script into TeamCity”.
Installing CruiseControl.NET
You can download CruiseControl.NET from thoughtworks.org. After the installation process (further instructions) you should see an empty dashboard:
Installing Subversion
The CalculatorSample is using Subversion (SVN) for SourceControl, so we need to download SVN from subversion.tigris.org. I’m using the “Windows MSI installer with the basic win32 binaries” and installed them under “c:\Program Files (x86)\Subversion\”.
Installing FxCop
The CalculatorSample is using FxCop, so we need to download and install it next.
“FxCop is an application that analyzes managed code assemblies (code that targets the .NET Framework common language runtime) and reports information about the assemblies, such as possible design, localization, performance, and security improvements. Many of the issues concern violations of the programming and design rules set forth in the Design Guidelines for Class Library Developers, which are the Microsoft guidelines for writing robust and easily maintainable code by using the .NET Framework.”
[MSDN]
Creating a FAKE Project
Now create a new folder for the CalculatorSample sources. I’m using “d:\Calculator\” for the rest of the article.
The next step is to modify the CruiseControl.NET config file (“c:\Program Files (x86)\CruiseControl.NET\server\ccnet.config” on my machine):
<cruisecontrol>
<project>
<name>CalculatorExample</name>
<triggers>
<intervalTrigger name="continuous" seconds="30" initialSeconds="30"/>
</triggers>
<sourcecontrol type="svn">
<executable>c:\Program Files (x86)\Subversion\bin\svn.exe</executable>
<workingDirectory>d:\Calculator\</workingDirectory>
<trunkUrl>http://fake.googlecode.com/svn/trunk/Samples/Calculator/</trunkUrl>
</sourcecontrol>
<tasks>
<exec>
<executable>d:\Calculator\tools\Fake\Fake.exe</executable>
<baseDirectory>d:\Calculator\</baseDirectory>
<buildArgs>completeBuild.fsx</buildArgs>
</exec>
</tasks>
<publishers>
<merge>
<files>
<file>d:\Calculator\test\FXCopResults.xml</file>
<file>d:\Calculator\test\TestResults.xml</file>
<file>d:\Calculator\output\Results.xml</file>
</files>
</merge>
<xmllogger />
</publishers>
</project>
</cruisecontrol>
In this configuration I set up a trigger which checks every 30 sec. for changes in my CalculatorSample project.
If SVN finds changes FAKE.exe is called with my build script (completeBuild.fsx).
After the build I want to merge the FxCop and NUnit output files with my build results to create a build report.
Configuring the dashboard
In order to provide a nicer output on the dashboard we need to modify the BuildPlugins section in the dashboard.config file (“c:\Program Files (x86)\CruiseControl.NET\webdashboard\dashboard.config” on my machine):
<buildPlugins>
<buildReportBuildPlugin>
<xslFileNames>
<xslFile>xsl\header.xsl</xslFile>
<xslFile>xsl\modifications.xsl</xslFile>
<xslFile>xsl\NCoverSummary.xsl</xslFile>
<xslFile>xsl\fxcop-summary_1_36.xsl</xslFile>
<xslFile>xsl\unittests.xsl</xslFile>
<xslFile>xsl\nant.xsl</xslFile>
</xslFileNames>
</buildReportBuildPlugin>
<buildLogBuildPlugin />
<xslReportBuildPlugin
description="NCover Report"
actionName="NCoverBuildReport"
xslFileName="xsl\NCover.xsl"></xslReportBuildPlugin>
<xslReportBuildPlugin description="FxCop Report"
actionName="FxCopBuildReport"
xslFileName="xsl\fxcop-report_1_36.xsl" />
<xslReportBuildPlugin description="NUnit Report"
actionName="NUnitBuildReport"
xslFileName="xsl\tests.xsl" />
</buildPlugins>
As you can see we use the nant.xsl to transform the FAKE output to HTML.
Starting the build
Now if everything is configured correctly, you can tell CruiseControl.NET to run your build (press “Start” for your build project on the dashboard):
Now CruiseControl.NET should use SVN to checkout the CalculatorSample sources and run the build. The output on the project page for build 1 should look like this:
You can also inspect the NUnit and FxCop results:

Please feel free to give feedback if you have any problems with this article.
Tags:
CC.NET,
Continuous Integration,
CruiseControl,
CruiseControl.NET,
F#,
F-sharp Make,
Fake
Tuesday, 6. October 2009
Oct 06
I just released a new version of my Open Source Build Automation Framework “FAKE – F# Make”. You can read more about FAKE on the project website or in the Getting started with "FAKE – F# Make"-article.
Although the new release contains many bugfixes, I only want to show the two major improvements here.
1. FAKE 0.10 uses FSI instead of FSC
From now on FAKE uses the “F# Interactive” (fsi.exe) instead of the F# Compiler (fsc.exe) to run the build scripts, which brings two major improvements.
No TempPath for compiled binaries needed
Due to the fact that FAKE scripts are no longer compiled at the beginning of the build process, we don’t need a temporary folder for the created binaries.
Loading modules at runtime
The #load command in F# scripts allows us to load modules at runtime. Now we are able to put reusable Targets or TargetTemplates (see below) into external build script files.
2. TargetTemplates
TargetTemplates provide an easy way to reuse common Targets. Let’s consider a (very) small sample:
Target "TraceHello" (fun () ->
trace "Hello World from FAKE"
)
This Target “TraceHello” traces a “Hello World” string into our build log. Now we want it to be slightly more generic and to trace a custom string. We can do this by using a TargetTemplate:
/// createTraceTarget: string -> string -> Target
let createTraceTarget = TargetTemplate (fun s ->
trace s
)
Now we have a template (or a function which generates targets) that gets a string for the target name and a string for the trace text and generates a usable target:
createTraceTarget "TraceHello" "Hello World from FAKE"
createTraceTarget "Trace2" "Trace another text"
Of course the TargetTemplate function is generic and can be used with any tuple as parameter:
/// createTraceTarget: string -> string*int -> Target
let createTraceTarget = TargetTemplate (fun (s,d) ->
trace s
trace <| sprintf "my int: %d" d
)
createTraceTarget "TraceHello" ("Hello World from FAKE",2)
createTraceTarget "Trace2" ("Trace another text",42)
Tags:
F#,
F#,
F-sharp Make,
Fake
Wednesday, 17. June 2009
Jun 17
Yesterday I was talking about F# at the .NET Developer Group Braunschweig. It was my first talk completely without PowerPoint (just Live-Coding and FlipChart) and I have to admit this is not that easy. But the event was really a big fun and we covered a lot of topics like FP fundamentals, concurrency and domain specific languages (of course I showed “FAKE – F# Make”).
Now I have a bit time before I go to the next BootCamp in Leipzig. Today Christian Weyer will show us exciting new stuff about WCF and Azure.
In the meanwhile I will write here about another important question (see first article) from the F# BootCamp in Leipzig:
Question 4 – Try to explain “Currying” and “Partial Application”. Hint: Please show a sample and use the pipe operator |>.
Obviously this was a tricky question for FP beginners. There are a lot of websites, which give a formal mathematical definition but don’t show the practical application.
“Currying … is the technique of transforming a function that takes multiple arguments (or more accurately an n-tuple as argument) in such a way that it can be called as a chain of functions each with a single argument”
[Wikipedia]
I want to show how my pragmatic view of the terms here, so let’s consider this small C# function:
public int Add(int x, int y)
{
return x + y;
}
Of course the corresponding F# version looks nearly the same:
let add(x,y) = x + y
But let’s look at the signature: val add : int * int –> int. The F# compiler is telling us add wants a tuple of ints and returns an int. We could rewrite the function with one blank to understand this better:
let add (x,y) = x + y
As you can see the add function actually needs only one argument – a tuple:
let t = (3,4) // val t : int * int
printfn "%d" (add t) // prints 7 – like add(3,4)
Now we want to curry this function. If you’d ask a mathematician this a complex operation, but from a pragmatic view it couldn’t be easier. Just remove the brackets and the comma – that’s all:
let add x y = x + y
Now the signature looks different: val add : int -> int –> int
But what’s the meaning of this new arrow? Basically we can say if we give one int parameter to our add function we will get a function back that will take only one int parameter and returns an int.
let increment = add 1 // val increment : (int -> int)
printfn "%d" (increment 2) // prints 3
Here “increment” is a new function that uses partial application of the curryied add function. This means we are fixing one of the parameters of add to get a new function with one parameter less.
But why are doing something like this? Wouldn’t it be enough to use the following increment function?
let add(x,y) = x + y // val add : int * int -> int
let increment x = add(x,1) // val increment : int -> int
printfn "%d" (increment 2) // prints 3
Of course we are getting (nearly) the same signature for increment. But the difference is that we can not use the forward pipe operator |> here. The pipe operator will help us to express things in the way we are thinking about it.
Let’s say we want to filter all even elements in a list, then calculate the sum and finally square this sum and print it to the console. The C# code would look like this:
var list = new List<int> {4,2,6,5,9,3,8,1,3,0};
Console.WriteLine(Square(CalculateSum(FilterEven(list))));
If we don’t want to store intermediate results we have to write our algorithm in reverse order and with heavily use of brackets. The function we want to apply last has to be written first. This is not the way we think about it.
With the help of curried functions, partial application and the pipe operator we can write the same thing in F#:
let list = [4; 2; 6; 5; 9; 3; 8; 1; 3; 0]
let square x = x * x
list
|> List.filter (fun x -> x % 2 = 0) // partial application
|> List.sum
|> square
|> printfn "%A" // partial application
We describe the data flow in exactly the same order we talked about it. Basically the pipe operator take the result of a function and puts it as the last parameter into the next function.
What should we learn from this sample?
- Currying has nothing to do with spicy chicken.
- The |> operator makes life easier and code better to understand.
- If we want to use |> we need curryied functions.
- Defining curryied functions is easy – just remove brackets and comma.
- We don’t need the complete mathematical theory to use currying.
- Be careful with the order of the parameter in a curryied function. Don’t forget the pipe operator puts the parameter from the right hand side into your function – all other parameters have to be fixed with partial application.
Tags:
.NET Developer Group Braunschweig,
.NET User Group Leipzig,
Currying,
F#,
F-sharp Make,
Fake,
partial application,
pipe,
|>
Wednesday, 15. April 2009
Apr 15
Easy TeamCity integration is one of the major goals for the FAKE build system.
“TeamCity is a Java-based build management and continuous integration server from JetBrains, creators of IntelliJ IDEA and ReSharper.”
[Wikipedia]
In this article I will show you how you can set up a FAKE build script in TeamCity. We will use the CalculatorSample which you can download from the FAKE Download page. If you want to know how this build script works read the “Getting started with FAKE”-tutorial.
Installing TeamCity
You can download the free professional edition of TeamCity from http://www.jetbrains.com/teamcity/. After the installation process (further instructions) you should be ready to configure your first build:

Creating a FAKE Project
Now create a new project and add a build configuration:


Attach a VCS root
The next step is to attach a VCS root. For this sample we will use the Calculator SVN root at http://fake.googlecode.com/svn/trunk/Samples/Calculator/.
[The only issue with this setting is, that you can’t change the path to the F# compiler. It is fixed to c:\Program Files (x86)\FSharp-1.9.6.2\bin\. If your path is different just reinstall F# to this location or use your own Version Control System.]


Choosing a build runner
We can use the Command Line build runner to start the completeBuild.fsx build script via Fake.exe. As the build provides NUnit test results we instruct TeamCity to import them:

If you want you could also add a build trigger to your build script:

Running the build
Now if everything is configured correctly, you can run your build and the output should look like:

You can also inspect the NUnit and FxCop results:

Tags:
Code Quality,
Continuous Integration,
F#,
F-sharp Make,
Fake,
FxCop,
nunit,
TeamCity
Tuesday, 14. April 2009
Apr 14
“FAKE – F# Make” is intended to be an extensible build framework. That’s why I tried to make it as easy as possible to create custom tasks. This posts shows how we can create a (very simple) custom task in C# which gives a random number.
First of all open Visual Studio and create a new C# class library called my MyCustomTask and create a class called RandomNumberTask:
using System;
namespace MyCustomTask
{
public class RandomNumberTask
{
public static int RandomNumber(int min, int max)
{
var random = new Random();
return random.Next(min, max);
}
}
}
Now compile this project and put the resulting assembly and debug symbols into the tools/FAKE path of your project. Now you can use your CustomTask in the build script:
#light
// include Fake libs
#I "tools\FAKE"
#r "FakeLib.dll"
// include CustomTask
#r "MyCustomTask.dll"
open Fake
// open CustomNamespace
open MyCustomTask
// use custom functionality
let x = RandomNumberTask.RandomNumber(2,13)
sprintf "RandomNumber: %d" x |> trace
You can use every .Net class with FAKE. Just put the assembly in the right folder (tools/FAKE) and include it with the #r command.
If you want to use FAKE standard functionality (like globbing) within your CustomTask project, just reference FakeLib.dll and explore the FAKE namespace.
Tags:
F#,
F-sharp Make,
Fake,
MSBuild,
NAnt
Sunday, 5. April 2009
Apr 05
This post addresses the No. 1 Feature request for MSBuild: Debugging.
With FAKE builds scripts debugging is no issue. Just write System.Diagnostics.Debugger.Break() somewhere into your build script and start the build. It is nearly as easy as pressing F9 in Visual Studio.
If the build script reaches your Breakpoint it will ask you which Debugger you want to use:
If you are editing your build script in Visual Studio you can select that instance otherwise choose a new instance and you are ready to debug:

Tags:
Debugging,
Debugging build scripts,
F#,
F-sharp Make,
MSBuild
Saturday, 4. April 2009
Apr 04
In the last two articles I showed how we can set up FAKE to make an automated build and how we can use it with FxCop. This time we will use FAKE’s AssemblyInfo task in order to set a specific version info to our assemblies.
I assume you have succeeded the CaculatorSample tutorial. If so then just modify your “Build” target to the following:
Target "BuildApp" (fun () ->
AssemblyInfo
(fun p ->
{p with
CodeLanguage = CSharp;
AssemblyVersion = version;
AssemblyTitle = "Calculator Command line tool";
AssemblyDescription = "Sample project for FAKE - F# MAKE";
Guid = "A539B42C-CB9F-4a23-8E57-AF4E7CEE5BAA";
OutputFileName = @".\src\app\Calculator\Properties\AssemblyInfo.cs"})
AssemblyInfo
(fun p ->
{p with
CodeLanguage = CSharp;
AssemblyVersion = version;
AssemblyTitle = "Calculator library";
AssemblyDescription = "Sample project for FAKE - F# MAKE";
Guid = "EE5621DB-B86B-44eb-987F-9C94BCC98441";
OutputFileName = @".\src\app\CalculatorLib\Properties\AssemblyInfo.cs"})
let target = "Build"
// compile all projects below src\app\
let apps = MSBuild buildDir target appReferences
// log the output files
Log "AppBuild-Output: " apps
)
As you can see modifying your AssemblyInfo.cs file is pretty easy with FAKE. The AssemblyInfo task works for C#, VB.Net and F#. The version parameter can be declared as a property or fetched from a build server like TeamCity:
let version =
let no = System.Environment.GetEnvironmentVariable("BUILD_NUMBER")
if no <> "" && no <> null then no else "0.2"

Tags:
assemblyinfo,
F#,
F-sharp Make,
MSBuild,
NAnt,
TeamCity