Skip to content

Reference | Filesets

olegz edited this page Mar 16, 2026 · 2 revisions

Working with filesets

A fileset represents rules for collecting a list of files. Filesets are "materialized" on demand — paths are resolved relative to the project root folder.

Computation expression

The fileset builder is the most flexible way to define a fileset:

let sourceFiles = fileset {
    basedir "src"
    includes "**/*.fs"
    includes "**/*.fsx"
    excludes "**/obj/**"
    excludes "**/bin/**"

    // conditional include
    includesif includeTests "test/**/*.fs"

    // fail if no files match
    failonempty true

    // join another fileset
    join commonFiles
}

Operators

// Create a fileset from a pattern
let src = ls "src/*.fs"
// Equivalent
let src = !! "src/*.fs"

// Add patterns
let allSrc = !! "src/*.fs" + "common/*.fs"

// Exclude patterns
let filtered = !! "src/**/*.fs" - "**/tests.fs"

// Set base directory
let rooted = !! "**/*.fs" @@ "src/core"

// Conditional add
let withTests = !! "src/**/*.fs" +? (includeTests, "test/**/*.fs")

// Create empty fileset with basedir
let empty = +"src"

Operator summary

Operator Description
!! "pattern" Create a fileset from a file mask
ls "pattern" Same as !!
fs + "pattern" Add an include pattern
fs - "pattern" Add an exclude pattern
fs @@ "dir" Set the base directory
fs +? (cond, "pattern") Conditional include
+"dir" Empty fileset with a base directory

Using in recipes

getFiles

Evaluates a fileset and records a dependency on the resulting file list. The target will rerun if files are added or removed.

let! files = getFiles <| fileset {
    basedir "src/core"
    includes "**/*.fs"
}

needFiles

Demands files from a file list — the target rebuilds if any file's content changes.

do! needFiles files

dependsOn

Combines getFiles and needFiles in a single call:

do! dependsOn !! "src/**/*.fs"

do! dependsOn <| fileset {
    basedir "src/core"
    includes "**/*.fs"
}

Pattern syntax

Filesets use Ant-style glob patterns:

Pattern Matches
*.fs All .fs files in the base directory
**/*.fs All .fs files recursively
src/*/main.fs main.fs in any immediate subdirectory of src
.. Parent directory

Xake normalizes slashes automatically — use / or \ interchangeably.

Fileset builder operations

Operation Description
basedir "dir" Set the base directory for all patterns
includes "pattern" Add an include pattern
excludes "pattern" Add an exclude pattern
includesif cond "pattern" Conditional include
excludesif (cond, "pattern") Conditional exclude
join otherFileset Merge another fileset
includefile fileInfo Read patterns from a file as includes
excludefile fileInfo Read patterns from a file as excludes
failonempty true Fail if no files match

Clone this wiki locally