# Visual Studio

version 8.0

| The Visual Studio Plugin is not compatible with the configuration cache.

The Visual Studio Plugin generate files that are used by the Visual Studio IDE, thus making it possible to open the solution into Visual Studio (`File` - `Open` - `Project/Solution…​`).

What exactly the `visual-studio` plugin generates depends on which other plugins are used:

Table 1. Visual Studio Plugin behavior
Plugin | Description
--- | ---
None | Generates minimal solution file.
C++ Application | Adds a project representing the C++ application to the solution file.
C++ Library | Adds a project for each specified linkage representing the shared and/or static library to the solution file.

## Usage

Example 1. Applying the Visual Studio Plugin
build.gradle.kts

    plugins {
        `visual-studio`
    }

build.gradle

    plugins {
        id 'visual-studio'
    }

The Visual Studio Plugin adds a number of tasks to your project. The main tasks that you will use are the `visualStudio`, `cleanVisualStudio` and `openVisualStudio` tasks.

## Tasks

The following diagram shows the relationships between tasks added by this plugin.

Figure 1. Visual Studio Plugin default task graph

### Lifecycle Tasks

`visualStudio` — Task

  Depends on: `projectNameVisualStudioSolution` and all Visual Studio project file generation tasks

  Generates all Visual Studio configuration files.

`cleanVisualStudio` — Delete

  Depends on: all Visual Studio project and solution file clean tasks

  Removes all Visual Studio configuration files.

`openVisualStudio` - Task

  Depends on: `visualStudio`

  Open the Visual Studio solution inside the IDE.

### IDE Workspace Tasks

`projectNameVisualStudioSolution` - GenerateSolutionFileTask

  Generates the `.sln` file. This task is only available on the root project.

### IDE Project Tasks

#### C++ Application Plugin Tasks

`projectNameVisualStudioProject` — GenerateProjectFileTask

  Generates the `.vcxproj` file for the application component.

`projectNameVisualStudioFilters` — GenerateFiltersFileTask

  Generates the `.vcxproj.filters` file for the application component.

`mainVisualStudio` - Task (lifecycle)

  Depends on: `projectNameVisualStudioProject` and `projectNameVisualStudioFilters`

  Generates all Visual Studio project files for the application component.

#### C++ Library Plugin Tasks

`projectNameDllVisualStudioProject` — GenerateProjectFileTask

  Generates the `.vcxproj` file for the shared linkage of the `main` component.

`projectNameDllVisualStudioFilters` — GenerateFiltersFileTask

  Generates the `.vcxproj.filters` file for the shared linkage of the `main` component.

`projectNameLibVisualStudioProject` — GenerateProjectFileTask

  Generates the `.vcxproj` file for the static linkage of the `main` component.

`projectNameLibVisualStudioFilters` — GenerateFiltersFileTask

  Generates the `.vcxproj.filters` file for the static linkage of the `main` component.

`mainVisualStudio` - Task (lifecycle)

  Depends on: `projectNameDllVisualStudioProject` (for shared linkage), `projectNameDllVisualStudioFilters` (for shared linkage), `projectNameLibVisualStudioProject` (for static linkage) and `projectNameLibVisualStudioFilters` (for static linkage)

  Generates all Visual Studio project files for the library component.

## Configuration

The Visual Studio Plugin allows for some customization of the generated files. The following sections are shows the customization.

### Change solution generated file location

The location of the generated solution can be configured on the root project:

Example 2. Change the generated solution file location
build.gradle.kts

    visualStudio {
        solution {
            solutionFile.setLocation(file("solution.sln"))
        }
    }

build.gradle

    visualStudio {
        solution {
            solutionFile.location = file('solution.sln')
        }
    }

### Change project generated files location

The location of the generated project files can be configured on any project:

Example 3. Change the generated project files location
build.gradle.kts

    visualStudio {
        projects.all {
            projectFile.setLocation(file("project.vcxproj"))
            filtersFile.setLocation(file("project.vcxproj.filters"))
        }
    }

build.gradle

    visualStudio {
        projects.all {
            projectFile.location = file('project.vcxproj')
            filtersFile.location = file('project.vcxproj.filters')
        }
    }