Directory structure of published ASP.NET Core apps

By Luke Latham

In ASP.NET Core, the application directory, publish, is comprised of application files, config files, static assets, packages, and the runtime (for self-contained apps).

App Type Directory Structure
Framework-dependent Deployment
  • publish*
    • logs* (if included in publishOptions)
    • refs*
    • runtimes*
    • Views* (if included in publishOptions)
    • wwwroot* (if included in publishOptions)
    • .dll files
    • myapp.deps.json
    • myapp.dll
    • myapp.pdb
    • myapp.PrecompiledViews.dll (if precompiling Razor Views)
    • myapp.PrecompiledViews.pdb (if precompiling Razor Views)
    • myapp.runtimeconfig.json
    • web.config (if included in publishOptions)
Self-contained Deployment
  • publish*
    • logs* (if included in publishOptions)
    • refs*
    • Views* (if included in publishOptions)
    • wwwroot* (if included in publishOptions)
    • .dll files
    • myapp.deps.json
    • myapp.exe
    • myapp.pdb
    • myapp.PrecompiledViews.dll (if precompiling Razor Views)
    • myapp.PrecompiledViews.pdb (if precompiling Razor Views)
    • myapp.runtimeconfig.json
    • web.config (if included in publishOptions)

* Indicates a directory

The contents of 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 in the deployment, its location serves as the server's physical path to the hosted application. The wwwroot directory, if present, only contains static assets. The logs directory may be included in the deployment by creating it in the project and adding the <Target> element shown below to your .csproj file or by physically creating the directory on the server.

<Target Name="CreateLogsFolder" AfterTargets="Publish">
  <MakeDir Directories="$(PublishDir)Logs" 
           Condition="!Exists('$(PublishDir)Logs')" />
  <WriteLinesToFile File="$(PublishDir)Logs\.log" 
                    Lines="Generated file" 
                    Overwrite="True" 
                    Condition="!Exists('$(PublishDir)Logs\.log')" />
</Target>

The <MakeDir> 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 <WriteLinesToFile> element generates a file in the Logs folder, which guarantees deployment of the folder to the server. Note that folder creation may still fail if the worker process doesn't have write access to the target folder.

The deployment directory requires Read/Execute permissions, while the Logs directory requires Read/Write permissions. Additional directories where assets will be written require Read/Write permissions.