NAnt is a build automation tool for the .NET platform, modelled on Apache Ant and driven by an XML build file. A build file declares a project with a default target; targets declare what they depend on; and targets contain tasks — compile, copy, delete, zip, run tests, invoke an external tool. NAnt resolves the dependency graph, runs each target once, and stops on the first failure unless you tell it otherwise. It is a small, comprehensible system, and that is precisely why a great deal of long-lived .NET software is still built with it.
The language has four things worth knowing well. Properties are named values that are, by default, immutable once set — a deliberate difference from Ant users' expectations and a frequent source of confusion. Expressions and the function library give NAnt real capability without scripting: string, path, file, directory, datetime, version and environment functions evaluated inline with the ${...} syntax. Filesets, with include and exclude patterns, are how a build addresses groups of files without enumerating them. Loggers and listeners control output, and the XML logger in particular is what makes NAnt output consumable by a CI server.
The honest position matters here. NAnt has not had a major release for well over a decade, it targets the .NET Framework rather than modern .NET, and no new project should start on it. But the builds that use it are frequently the ones producing revenue-critical software, and they cannot be rewritten on a whim. Working with NAnt today means two things at once: operating and maintaining existing build files competently, and knowing how to read them accurately enough to migrate the process — not just the syntax — onto something maintained.
Why this skill matters now
There is a large amount of production .NET software whose build is a NAnt file written by someone who left years ago. It works, until it does not: a build agent is rebuilt with a different framework version, a task from an old extension assembly stops loading, a fileset silently stops matching, or a release needs a change nobody dares make. At that point the organisation needs someone who can read the build file properly, and those people are increasingly rare because nobody learns NAnt from scratch any more.
The second and larger driver is migration. Moving from NAnt to MSBuild, or to a scripted build in another language, is not a mechanical translation. A NAnt build encodes years of accumulated decisions — versioning, output layout, signing, packaging, deployment steps, environment handling — and the risk is not in the syntax but in silently losing one of those behaviours. Migrating safely requires first documenting exactly what the existing build does, which requires genuinely understanding NAnt.
Both needs are real and both are underserved. Generic .NET training ignores NAnt entirely, and the surviving online material assumes a 2008 toolchain. Teams that carry a NAnt build need training that takes it seriously as a system to be operated and, when the time comes, retired deliberately rather than abandoned.