.NET Core command-line file watcher (dotnet watch) for MSBuild
Basic usage and pro-tips for using dotnet-watch with MSBuild
The most recent preview (1.0.0-msbuild2-final)
of dotnet-watch
supports MSBuild projects, and is the most configurable, extensible version of the tool, yet.
dotnet-watch
is a file watcher for dotnet
that restarts the specified application when changes in the source code are detected.
This tool has been available since the days of DNX with support for project.json.
dotnet-watch
for MSBuild adds new features that were not available in the project.json versions.
See also: https://github.com/aspnet/DotNetTools/ for more documentation and to report issues.
Basic usage
How To Install
Visual Studio 2017 RC
Note: soon, the NuGet GUI will be able to install this package, but is broken in the most recent RC.
- Open your .NET Core project in VS 2017 RC.
- Right click on the project in Solution Explorer.
- Select “Edit (YourProject).csproj”.
- Continue with next section
Visual Studio Code or command-line users
Add Microsoft.DotNet.Watcher.Tools
as a DotNetCliToolReference
to your project by adding this to the csproj file.
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="1.0.0-msbuild2-final" />
</ItemGroup>
How To Use
On command line, change directories (cd C:\dev\MyApp
) into the directory containing your project. Then execute dotnet watch
.
This will show detailed help information and some examples.
To make dotnet-watch do something, add watch
between dotnet
and the command arguments that you want to execute.
For example, if you want to repeatedly run tests, execute dotnet watch test
. Or, if you want to recompile and launch
your website when a C# file changes, run dotnet watch run
. All dotnet blah
verbs are supported. (In theory, you could
even run dotnet watch watch watch run
….but I don’t recommend it.)
What’s new
dotnet-watch can be configured with settings in the MSBuild project file being watched.
Customize which files are watched
By default, dotnet-watch will track all **/*.cs
, *.csproj
, and **/*.resx
files for changes.
Well, kinda. The truth is a little more technical: the default is actually everything in the Compile and EmbeddedResource item groups,
plus any file added to the MSBuildProjectFiles list….but for most projects, this means all C# files.
More items can be added to the watchlist by editing the csproj file. Items can be added individually, or by using glob patterns.
<ItemGroup>
<!-- extends watching group to include *.js files -->
<Watch Include="**\*.js" Exclude="node_modules\**\*;**\*.js.map;obj\**\*;bin\**\*" />
</ItemGroup>
Opt-out of defaults
dotnet-watch can be configured to ignore its default settings. To ignore specific
files, add the Watch="false"
attribute an item’s definition in the csproj file.
Example:
<ItemGroup>
<!-- exclude Generated.cs from dotnet-watch -->
<Compile Include="Generated.cs" Watch="false" />
<!-- exclude Strings.resx from dotnet-watch -->
<EmbeddedResource Include="Strings.resx" Watch="false" />
<!-- exclude changes in this referenced project -->
<ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj" Watch="false" />
</ItemGroup>
For MSBuild ninjas
The ‘watch’ build
When dotnet-watch reads a *.csproj to find which files it should watch,
it actually executes the MSBuild project. It calls a target named GenerateWatchList
in the project. When this target runs, dotnet-watch will set the property DotNetWatchBuild=true
.
This is similar to how Visual Studio and VS Code execute the csproj with DesignTimeBuild=true
to discover files, NuGet references, etc.
Custom ‘watch projects’
dotnet-watch is not restricted to C# projects. You can create custom ‘watch’ projects to do your bidding.
Example: watch multiple test projects
Example: let’s say you have the following project layout:
test/
UnitTests/UnitTests.csproj
IntegrationTests/IntegrationTests.csproj
If you wanted to watch multiple projects, and execute tests on all, you create file like this
in test/watch.proj
:
<Project ToolsVersion="15.0">
<ItemGroup>
<TestProjects Include="**\*.csproj" />
<Watch Include="**\*.cs" />
</ItemGroup>
<Target Name="Test">
<MSBuild Targets="VSTest" Projects="@(TestProjects)" />
</Target>
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="1.0.0-msbuild3-final" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft.Common.targets"/>
</Project>
Then execute
cd test\
dotnet restore watch.proj
dotnet watch msbuild /t:Test
This will watch all test projects, and execute VSTest when any file changes.