forked from FakeBuild/Xake
-
Notifications
You must be signed in to change notification settings - Fork 0
Reference | Filesets
olegz edited this page Mar 16, 2026
·
2 revisions
A fileset represents rules for collecting a list of files. Filesets are "materialized" on demand — paths are resolved relative to the project root folder.
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
}// 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 | 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 |
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"
}Demands files from a file list — the target rebuilds if any file's content changes.
do! needFiles filesCombines getFiles and needFiles in a single call:
do! dependsOn !! "src/**/*.fs"
do! dependsOn <| fileset {
basedir "src/core"
includes "**/*.fs"
}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.
| 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 |