---
title: ASP.NET Core directory structure
author: rick-anderson
description: Learn about the directory structure of published ASP.NET Core apps.
monikerRange: '>= aspnetcore-2.2'
ms.author: riande
ms.custom: mvc
ms.date: 04/09/2020
uid: host-and-deploy/directory-structure
---
# ASP.NET Core directory structure
[!INCLUDE[](~/includes/not-latest-version.md)]
:::moniker range=">= aspnetcore-6.0"
The *publish* directory contains the app's deployable assets produced by the [dotnet publish](/dotnet/core/tools/dotnet-publish) command. The directory contains:
* Application files
* Configuration files
* Static assets
* Packages
* A runtime ([self-contained deployment](/dotnet/core/deploying/#self-contained-deployments-scd) only)
| App Type | Directory Structure |
| -------- | ------------------- |
| [Framework-dependent Executable (FDE)](/dotnet/core/deploying/#framework-dependent-executables-fde) |
- publish†
- Views† MVC apps; if views aren't precompiled
- Pages† MVC or Razor Pages apps, if pages aren't precompiled
- wwwroot†
- \*.dll files
- {ASSEMBLY NAME}.deps.json
- {ASSEMBLY NAME}.dll
- {ASSEMBLY NAME}{.EXTENSION}.exe extension on Windows, no extension on macOS or Linux
- {ASSEMBLY NAME}.pdb
- {ASSEMBLY NAME}.runtimeconfig.json
- web.config (IIS deployments)
- createdump ([Linux createdump utility](https://github.com/dotnet/coreclr/blob/master/Documentation/botr/xplat-minidump-generation.md#configurationpolicy))
- \*.so (Linux shared object library)
- \*.a (macOS archive)
- \*.dylib (macOS dynamic library)
|
| [Self-contained Deployment (SCD)](/dotnet/core/deploying/#self-contained-deployments-scd) | - publish†
- Views† MVC apps, if views aren't precompiled
- Pages† MVC or Razor Pages apps, if pages aren't precompiled
- wwwroot†
- \*.dll files
- {ASSEMBLY NAME}.deps.json
- {ASSEMBLY NAME}.dll
- {ASSEMBLY NAME}{.EXTENSION} .exe extension on Windows, no extension on macOS or Linux
- {ASSEMBLY NAME}.pdb
- {ASSEMBLY NAME}.runtimeconfig.json
- web.config (IIS deployments)
|
†Indicates a directory
The *publish* directory represents the *content root path*, also called the *application base path*, of the deployment. Whatever name is given to the *publish* directory of the deployed app on the server, its location serves as the server's physical path to the hosted app.
The *wwwroot* directory, if present, only contains static assets.
## Additional resources
* [dotnet publish](/dotnet/core/tools/dotnet-publish)
* [.NET Core application deployment](/dotnet/core/deploying/)
* [Target frameworks](/dotnet/standard/frameworks)
* [.NET Core RID Catalog](/dotnet/core/rid-catalog)
:::moniker-end
:::moniker range=">= aspnetcore-3.0 < aspnetcore-6.0"
The *publish* directory contains the app's deployable assets produced by the [dotnet publish](/dotnet/core/tools/dotnet-publish) command. The directory contains:
* Application files
* Configuration files
* Static assets
* Packages
* A runtime ([self-contained deployment](/dotnet/core/deploying/#self-contained-deployments-scd) only)
| App Type | Directory Structure |
| -------- | ------------------- |
| [Framework-dependent Executable (FDE)](/dotnet/core/deploying/#framework-dependent-executables-fde) | - publish†
- Views† MVC apps; if views aren't precompiled
- Pages† MVC or Razor Pages apps, if pages aren't precompiled
- wwwroot†
- \*.dll files
- {ASSEMBLY NAME}.deps.json
- {ASSEMBLY NAME}.dll
- {ASSEMBLY NAME}{.EXTENSION}.exe extension on Windows, no extension on macOS or Linux
- {ASSEMBLY NAME}.pdb
- {ASSEMBLY NAME}.Views.dll
- {ASSEMBLY NAME}.Views.pdb
- {ASSEMBLY NAME}.runtimeconfig.json
- web.config (IIS deployments)
- createdump ([Linux createdump utility](https://github.com/dotnet/coreclr/blob/master/Documentation/botr/xplat-minidump-generation.md#configurationpolicy))
- \*.so (Linux shared object library)
- \*.a (macOS archive)
- \*.dylib (macOS dynamic library)
|
| [Self-contained Deployment (SCD)](/dotnet/core/deploying/#self-contained-deployments-scd) | - publish†
- Views† MVC apps, if views aren't precompiled
- Pages† MVC or Razor Pages apps, if pages aren't precompiled
- wwwroot†
- \*.dll files
- {ASSEMBLY NAME}.deps.json
- {ASSEMBLY NAME}.dll
- {ASSEMBLY NAME}{.EXTENSION} .exe extension on Windows, no extension on macOS or Linux
- {ASSEMBLY NAME}.pdb
- {ASSEMBLY NAME}.Views.dll
- {ASSEMBLY NAME}.Views.pdb
- {ASSEMBLY NAME}.runtimeconfig.json
- web.config (IIS deployments)
|
†Indicates a directory
The *publish* directory represents the *content root path*, also called the *application base path*, of the deployment. Whatever name is given to the *publish* directory of the deployed app on the server, its location serves as the server's physical path to the hosted app.
The *wwwroot* directory, if present, only contains static assets.
## Additional resources
* [dotnet publish](/dotnet/core/tools/dotnet-publish)
* [.NET Core application deployment](/dotnet/core/deploying/)
* [Target frameworks](/dotnet/standard/frameworks)
* [.NET Core RID Catalog](/dotnet/core/rid-catalog)
:::moniker-end
:::moniker range="< aspnetcore-3.0"
The *publish* directory contains the app's deployable assets produced by the [dotnet publish](/dotnet/core/tools/dotnet-publish) command. The directory contains:
* Application files
* Configuration files
* Static assets
* Packages
* A runtime ([self-contained deployment](/dotnet/core/deploying/#self-contained-deployments-scd) only)
| App Type | Directory Structure |
| -------- | ------------------- |
| [Framework-dependent Executable (FDE)](/dotnet/core/deploying/#framework-dependent-executables-fde) | - publish†
- Views† MVC apps; if views aren't precompiled
- Pages† MVC or Razor Pages apps, if pages aren't precompiled
- wwwroot†
- \*.dll files
- {ASSEMBLY NAME}.deps.json
- {ASSEMBLY NAME}.dll
- {ASSEMBLY NAME}{.EXTENSION} .exe extension on Windows, no extension on macOS or Linux
- {ASSEMBLY NAME}.pdb
- {ASSEMBLY NAME}.Views.dll
- {ASSEMBLY NAME}.Views.pdb
- {ASSEMBLY NAME}.runtimeconfig.json
- web.config (IIS deployments)
- createdump ([Linux createdump utility](https://github.com/dotnet/coreclr/blob/master/Documentation/botr/xplat-minidump-generation.md#configurationpolicy))
- \*.so (Linux shared object library)
- \*.a (macOS archive)
- \*.dylib (macOS dynamic library)
|
| [Self-contained Deployment (SCD)](/dotnet/core/deploying/#self-contained-deployments-scd) | - publish†
- Views† MVC apps, if views aren't precompiled
- Pages† MVC or Razor Pages apps, if pages aren't precompiled
- wwwroot†
- \*.dll files
- {ASSEMBLY NAME}.deps.json
- {ASSEMBLY NAME}.dll
- {ASSEMBLY NAME}.exe
- {ASSEMBLY NAME}.pdb
- {ASSEMBLY NAME}.Views.dll
- {ASSEMBLY NAME}.Views.pdb
- {ASSEMBLY NAME}.runtimeconfig.json
- web.config (IIS deployments)
|
†Indicates a directory
The *publish* directory represents the *content root path*, also called the *application base path*, of the deployment. Whatever name is given to the *publish* directory of the deployed app on the server, its location serves as the server's physical path to the hosted app.
The *wwwroot* directory, if present, only contains static assets.
Creating a *Logs* folder is useful for [ASP.NET Core Module enhanced debug logging](xref:host-and-deploy/iis/logging-and-diagnostics#enhanced-diagnostic-logs). Folders in the path provided to the `` value aren't created by the module automatically and should pre-exist in the deployment to allow the module to write the debug log.
A *Logs* directory can be created for the deployment using one of the following two approaches:
* Add the following `` element to the project file:
```xml
```
The `` element creates an empty *Logs* folder in the published output. The element uses the `PublishDir` property to determine the target location for creating the folder. Several deployment methods, such as Web Deploy, skip empty folders during deployment. The `` element generates a file in the *Logs* folder, which guarantees deployment of the folder to the server. Folder creation using this approach fails if the worker process doesn't have write access to the target folder.
* Physically create the *Logs* directory on the server in the deployment.
The deployment directory requires Read/Execute permissions. The *Logs* directory requires Read/Write permissions. Additional directories where files are written require Read/Write permissions.
## Additional resources
* [dotnet publish](/dotnet/core/tools/dotnet-publish)
* [.NET Core application deployment](/dotnet/core/deploying/)
* [Target frameworks](/dotnet/standard/frameworks)
* [.NET Core RID Catalog](/dotnet/core/rid-catalog)
:::moniker-end