How to watch for file changes "dotnet watch" with Visual Studio ASP.NET Core
If you want to use ASP.NET 2.x or 3.x you need to change it a bit.
The watch tool is a global tool now and you don't need to add it as a reference any longer
The syntax is slightly different
"Watch": { "executablePath": "dotnet.exe", "workingDirectory": "$(ProjectDir)", "commandLineArgs": "watch run", "launchBrowser": true, "launchUrl": "http://localhost:5000/", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }
For .Net 5 & 6
In VisualStudio 2019
- Go to Tools > ⚙ Options > Projects and Solutions > ASP .NET Core
- Select Auto build and refresh browser after saving changes in Auto build and refresh option
- Press Ctrl + F5 (Start Without Debugging) IMPORTANT: Only works if run without debbuging
Otherwise add this to your launchSettings.json
:
{
"iisSettings": {
...
},
"profiles": {
... ,
"Watch": {
"commandName": "Executable",
"executablePath": "dotnet.exe",
"workingDirectory": "$(ProjectDir)",
"commandLineArgs": "watch run"
}
}
}
The automatically generated profile
with "commandName":"Project"
has all the other properties needed: launchBrowser
, applicationUrl
, environmentVariables
, dotnetRunMessages
and hotReloadProfile
. Any modifications should be made there.
Corresponding Blog-Post from Juan Cruz Fiant: https://dev.to/juxant/auto-refresh-with-dotnet-watch-for-asp-net-core-projects-20no
The accepted answer works, but it's 4+ years old. So here's how you make it work for Visual Studio 2019 (v16.8.5 in my case).
Inside the profiles
section of launchSettings.json
, you add a new profile, let's say "API Watch", with this content:
"API Watch": {
"commandName": "Executable",
"executablePath": "dotnet",
"commandLineArgs": "watch run",
"workingDirectory": "$(ProjectDir)",
"launchBrowser": true,
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"dotnetRunMessages": "true"
}
And then you go and select it in the Build profiles dropdown:
Now when you run it, regardless if with or without Debug mode on, the re-build and browser refresh (I use the Swagger UI as default page) happens automatically.
One note about using it in Debug mode, is that Visual Studio will mark the changes with green and will say that they won't be applied until a restart happens. I can confirm that this is not true and that the changes are really reflected by the auto rebuild feature of dotnet watch run
. It's just that VS 2019 gets confused and treats things from the old (standard) perspective.
Open launchSettings.json and add this to profiles
.
"Watch": {
"executablePath": "C:\\Program Files\\dotnet\\dotnet.exe",
"commandLineArgs": "watch run",
"launchBrowser": true,
"launchUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
Open project.json and add this to tools
.
"Microsoft.DotNet.Watcher.Tools": "1.0.0-preview2-final"
After restoring, we can Watch from within Visual Studio.
Just one little correction to @Flynn`s answer. You need to add an
"commandName": "Executable"
argument to the "Watch" profile. Also to define the urls you should define them not in the "Watch" profile, but in the profile with
"commandName": "Program"
argument (it is present in the default launchsettings.json
, created by the Visual Studio project templates, so, your launchsettings.json
finally looks like this:
"AnyTest.WebClient": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"launchUrl": "",
"applicationUrl": "https://localhost:44353;http://localhost:51895",
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}"
},
"Watch": {
"commandName": "Executable",
"workingDirectory": "$(ProjectDir)",
"executablePath": "dotnet.exe",
"commandLineArgs": "watch run"
}
I kept the launchBrowser
argument in the Program
profile, but browser in not launched. But if this argument is present in the Executable
profile, the browser is not launched too and I found no way to launch it automatically.