可以按配置指定项目生成的输出位置(用于调试、发布或两者)。 使用默认设置时,输出文件夹因项目类型和 SDK 而异,某些项目使用特定于平台或特定于框架的子文件夹。
Visual Studio 提供的属性,通过指定相对于项目文件夹的路径或文件系统中的任何位置的绝对路径,可以将中间和最终输出放置在自定义文件夹中。 除了在 Visual Studio 项目属性中指定的设置之外,还可以通过编辑项目文件并使用 MSBuild 和 .NET SDK 的功能进一步自定义输出,以便完全控制项目输出的各个方面,无论是针对单个项目,还是在许多项目的解决方案级别。
在 Visual Studio 2022 中,根据项目类型,存在不同的项目设计器用户界面。 .NET Framework 项目使用旧的 .NET 项目设计器,但 .NET Core(和 .NET 5 及更高版本)项目使用当前的 .NET 项目设计器。 C++项目使用自己的属性页用户界面。 本部分中的步骤取决于所使用的项目设计器。
更改生成输出目录
此过程适用于面向 .NET Core 或 .NET 5 及更高版本的 Visual Studio 2022 中的项目。
清理项目或解决方案以删除任何现有输出文件(生成>清理解决方案)。
右键单击 解决方案资源管理器 中的项目节点,然后选择 属性。
对于 C# 项目,展开 构建 部分,然后向下滚动到 输出 小节。 对于 Visual Basic,展开“编译”部分,然后在“常规”下查看。
找到 基本输出路径,并输入要生成输出的路径(可为绝对路径或相对于项目根目录的相对路径),或选择 浏览 以定位该文件夹。 请注意,配置名称将追加到基本输出路径,以生成实际的输出路径。
C#:
Visual Basic:
说明
某些项目(.NET 和 ASP.NET Core)默认在最终输出路径中包含框架版本或运行时标识符。 若要更改此项,请右键单击解决方案资源管理器 中的项目节点,选择 编辑项目文件,然后添加以下内容:
<PropertyGroup>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
</PropertyGroup>
生成到公共输出目录
默认情况下,Visual Studio 在解决方案内自己的文件夹中生成解决方案中的每个项目。 可以更改项目的生成输出路径,以强制将所有输出放置在同一文件夹中。
清理解决方案以删除任何现有输出文件(生成>清理解决方案)。
单击解决方案中的一个项目。
在“项目”菜单上,单击 属性。
在每个项目中,根据其类型,选择 编译 或 生成,并将 输出路径 或 基本输出路径 设置为用于解决方案中的所有项目的文件夹。
打开项目的项目文件,并将以下属性声明添加到第一个属性组。
<PropertyGroup>
<!-- existing property declarations are here -->
<UseCommonOutputDirectory>true</UseCommonOutputDirectory>
</PropertyGroup>
将 UseCommonOutputDirectory 设置为 true 告知 Visual Studio 及其基础生成引擎(MSBuild)将多个项目输出放在同一文件夹中,因此 MSBuild 省略项目依赖于其他项目时通常发生的复制步骤。
对解决方案中的所有项目重复步骤 2-5。 如果你有一些不应使用常见输出目录的特殊项目,则可以跳过某些项目。
提示
如果系统未将输出生成到指定位置,请在 Visual Studio 的菜单栏上选择该位置,确保生成相应的配置(例如“调试”或“发布”)。
此过程适用于 .NET Framework 项目。
清理项目或解决方案以删除任何现有输出文件(生成>清理解决方案)。
右键单击 解决方案资源管理器 中的项目节点,然后选择 属性。
根据项目类型选择相应的选项卡:
- 对于 C#,选择“生成”选项卡。
- 对于 Visual Basic,选择“编译”选项卡。
在顶部的配置下拉列表中,选择要更改其输出文件位置的配置(调试、发布或 所有配置)。
在页面上查找输出路径条目 - 它因项目类型而异:
-
C# 和 JavaScript 项目的输出路径
-
Visual Basic 项目的生成输出路径
键入要生成输出的路径(绝对或相对于根项目目录),或选择“浏览”,浏览到该文件夹。
生成到公共输出目录
默认情况下,Visual Studio 在解决方案内自己的文件夹中生成解决方案中的每个项目。 可以更改项目的生成输出路径,以强制将所有输出放置在同一文件夹中。
清理解决方案以删除任何现有输出文件(生成>清理解决方案)。
单击解决方案中的一个项目。
在“项目”菜单上,单击 属性。
在每个项目中,根据其类型,选择 编译 或 生成,并将 输出路径 或 基本输出路径 设置为用于解决方案中的所有项目的文件夹。
打开项目的项目文件,并将以下属性声明添加到第一个属性组。
<PropertyGroup>
<!-- existing property declarations are here -->
<UseCommonOutputDirectory>true</UseCommonOutputDirectory>
</PropertyGroup>
将 UseCommonOutputDirectory 设置为 true 告知 Visual Studio 及其基础生成引擎(MSBuild)将多个项目输出放在同一文件夹中,因此 MSBuild 省略项目依赖于其他项目时通常发生的复制步骤。
对解决方案中的所有项目重复步骤 2-5。 如果你有一些不应使用常见输出目录的特殊项目,则可以跳过某些项目。
提示
如果系统未将输出生成到指定位置,请在 Visual Studio 的菜单栏上选择该位置,确保生成相应的配置(例如“调试”或“发布”)。
若要更改单个C++项目的生成输出目录,请执行以下作:
清理项目以删除任何现有输出文件(生成>清理解决方案)。
右键单击 解决方案资源管理器 中的项目节点,然后选择 属性。
选择 常规 选项卡。
在顶部的配置下拉列表中,选择要更改其输出文件位置的配置(调试、发布或 所有配置)。
如果正在查看“所有配置”或“所有平台”,可能会看到某些属性的 <different options>。 对于配置和平台的每个组合,属性值可能有所不同。 虽然可以单独设置它们,但默认设置对所有组合使用相同的表达式,但它们使用宏 $(Configuration) 和 $(Platform) 为每个组合生成唯一的输出路径。
在 输出目录中找到输出路径。 下拉列表提供用于编辑表达式或浏览到路径的选项,或者(如果相关)“<从父级或项目默认值继承>”选项。
键入要生成输出的路径(绝对或相对于根项目目录),或选择“浏览”,浏览到该文件夹。
对于依赖于宏值的表达式,请单击 宏 >> 以查看可用的宏及其值。 此对话框还显示该属性在当前宏值下的最终扩展值。
所有环境变量都以属性的形式在 MSBuild 中公开,因此,如果需要引用环境变量,可以使用环境变量的语法 $(VAR) 来引用它 VAR。 使用宏和环境变量生成路径时,请注意是否需要反斜杠。
此过程在项目文件(OutDir)中设置属性 .vcxproj。 如果在设置此属性后查看项目文件,则会看到添加类似于以下内容的代码:
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>C:\MyOutputFolder</OutDir>
</PropertyGroup>
有关详细信息,请参阅 常规属性页 并确保熟悉如何使用C++属性页来了解属性值如何依赖于配置和平台,请参阅 使用项目属性。
此过程适用于面向 .NET Core 或 .NET 5 及更高版本的 Visual Studio 2022 中的项目。
清理项目以删除任何现有输出文件。
打开项目文件。
将以下属性声明添加到第一个属性组。
<PropertyGroup>
<!-- existing property declarations are here -->
<IntermediateOutputPath>path</IntermediateOutputPath>
</PropertyGroup>
路径相对于项目文件,也可以使用绝对路径。 如果要将项目名称放在路径中,可以使用 MSBuild 属性 $(MSBuildProjectName)$(MSBuildProjectDirectory)来引用它。 有关其他可以使用的属性,请参阅 MSBuild 保留属性和已知属性。
生成时,Visual Studio 仍会在项目文件夹下创建 obj 文件夹,但它为空。 可以在生成过程中将其删除。 要实现这一点,可以添加生成后事件来运行以下命令:
rd "$(ProjectDir)obj" /s /q
请参阅指定自定义生成事件。
此过程适用于 .NET Framework 项目。
清理项目以删除任何现有输出文件。
打开项目文件。
将以下属性声明添加到第一个属性组。
<PropertyGroup>
<!-- existing property declarations are here -->
<IntermediateOutputPath>path</IntermediateOutputPath>
</PropertyGroup>
路径相对于项目文件,也可以使用绝对路径。 如果要将项目名称放在路径中,可以使用 MSBuild 属性 $(MSBuildProjectName)$(MSBuildProjectDirectory)来引用它。 有关其他可以使用的属性,请参阅 MSBuild 保留属性和已知属性。
生成时,Visual Studio 仍会在项目文件夹下创建 obj 文件夹,但它为空。 可以在生成过程中将其删除。 要实现这一点,可以添加生成后事件来运行以下命令:
rd "$(ProjectDir)obj" /s /q
请参阅指定自定义生成事件。
使用 中间目录 属性设置中间输出的目录,例如 .obj 文件。
在项目文件中,属性的值是 IntDir。 若要在项目文件中设置中间输出和最终输出的路径,请添加如下所示的属性组:
<PropertyGroup>
<OutDir>$(SolutionDir)out\$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)int\$(MSBuildProjectName)\$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
使用 Directory.Build.props 设置输出目录
如果你有大量项目,并且想要更改所有项目的输出文件夹,则使用本文前面所述的方法更改每个项目会很繁琐且容易出错。 在这种情况下,可以在解决方案文件夹中创建一个文件,Directory.Build.props,在一个位置设置相应的 MSBuild 属性,以应用于解决方案中的所有项目。 通过将具有此特定名称的文件放置在要受影响的所有项目的父文件夹中,可以轻松地在单个位置维护自定义项,并轻松更改值。 请参阅按文件夹自定义生成。
如果你有大量项目,并且想要更改所有项目的输出文件夹,则使用本文前面所述的方法更改每个项目会很繁琐且容易出错。 在这种情况下,可以在解决方案文件夹中创建一个文件,Directory.Build.props,在一个位置设置相应的 MSBuild 属性,以应用于解决方案中的所有项目。 通过将具有此特定名称的文件放置在要受影响的所有项目的父文件夹中,可以轻松地在单个位置维护自定义项,并轻松更改值。 请参阅按文件夹自定义生成。
如果你有大量项目,并且想要更改所有项目的输出文件夹,则使用本文前面所述的方法更改每个项目会很繁琐且容易出错。 在这种情况下,可以在解决方案文件夹中创建一个文件,Directory.Build.props,在一个位置设置相应的 MSBuild 属性,以应用于解决方案中的所有项目。 通过将具有此特定名称的文件放置在要受影响的所有项目的父文件夹中,可以轻松地在单个位置维护自定义项,并轻松更改值。 请参阅自定义 C++ 生成。
若要在 Directory.build.props中设置中间和最终输出路径,最好使用 $(MSBuildThisFileDirectory) 而不是 $(SolutionDir) 来支持命令行项目生成,其中未定义 $(SolutionDir)。 以下代码以适用于 Visual Studio 生成和单个项目的命令行生成的方式进行设置:
<Project>
<PropertyGroup>
<SolutionDir Condition="'$(SolutionDir)' == ''">$(MSBuildThisFileDirectory)</SolutionDir>
<OutDir>$(SolutionDir)out\$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)int\$(MSBuildProjectName)\$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
</Project>
使用生成工件来组织生成输出
对于 .NET 8 项目,可以使用工件功能来以高度可自定义和灵活的方式组织输出。 请参阅项目输出布局。
相关内容