如何控制Visual Studio中C#项目的输出文件夹?

a5g8bdjr  于 2023-05-29  发布在  C#
关注(0)|答案(4)|浏览(282)

在Visual Studio(目前在VS 2019中运行)中,有一个丰富的构建宏集合,我可以在C++项目中使用它们,让我根据所选择的配置控制编译文件存储在哪个文件夹中。因此,我可以为每个客户提供单独的配置。默认情况下,输出文件夹由$(SolutionDir)$(Configuration)提供。因此,我的CAPS项目可以将Release阿尔戈马项目的输出存储在CAPS/Release Algoma中,而US Steel的构建可以将其文件存储在CAPS/Release US Steel中。当我添加客户配置时,我不必更改任何内容,我的文件会自动存储在我想要的位置。
在C#中,我没有那些构建宏。如果向解决方案中添加新配置,我必须进入解决方案中的每个项目并更改输出文件夹。我是否有那些可用于C#项目的构建宏,或者是否有其他方法可以根据配置控制输出文件夹?

mjqavswn

mjqavswn1#

通过设置$(OutputPath)变量,可以在项目文件或其他MSBuild目标文件中指定输出目录。
您可以有条件地执行此操作:

<PropertyGroup Condition="'$(SomeCondition)'=='foo'>
  <OutputPath>foo\whatever\...</OutputPath>
</PropertyGroup>
<!-- or set the condition on the property -->
<PropertyGroup>
  <OutputPath Condition="'$(SomeCondition)'=='foo'>foo\whatever\...</OutputPath>
  <OutputPath Condition="'$(SomeCondition)'==''>default\whatever\...</OutputPath>
</PropertyGroup>

或者在很多情况下直接使用其他变量来构建值

<PropertyGroup>
  <OutputPath>$(SolutionDir)\$(Configuration)\$(MSBuildProjectName)</OutputPath>
</PropertyGroup>

请注意,$(SolutionDir)仅在IDE中构建时定义(根据文档),因此另一种方法可能是将Directory.Build.props放在解决方案文件夹或存储库根目录中,以定义输出目录的基本路径(可以使用$(MSBuildThisFileDirectory)引用文件所在的目录)。您还可以在该文件中定义$(OutputPath),它将被任何其他项目继承(因此在示例中使用$(MSBuildProjectName))-除非这些项目自己设置了值,覆盖了您的默认值。

prdp8dxp

prdp8dxp2#

在C#中...如果我向解决方案中添加新配置,我必须进入解决方案中的每个项目并更改输出文件夹。
如果您使用较新的SDK风格的.csproj项目文件,则输出文件夹将自动构建,并根据需要考虑配置、平台和目标框架。你能升级你的.csproj文件吗?
下面是一个“遗留”(非SDK风格).csproj文件的片段:

<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- snip -->
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <!-- snip -->
    <OutputPath>bin\Debug\</OutputPath>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <!-- snip -->
    <OutputPath>bin\Release\</OutputPath>
  </PropertyGroup>
  <!-- snip -->
</Project>

注意它是如何显式列出每个配置的OutputPath的?添加新的解决方案配置时,必须手动将该配置添加到每个.csproj文件中。
对于SDK风格的项目,等效的.csproj文件如下所示:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net472</TargetFramework>
  </PropertyGroup>
</Project>

Sdk属性从SDK中带来了一堆MSBuild props/targets,这些props/targets根据与项目相关的ConfigurationsPlatformsTargetFrameworks属性为您计算OutputPath

jv4diomz

jv4diomz3#

这是你要找的吗在项目属性中,Build Events,Edit Post-Build,然后此命令应执行此操作:
xcopy "$(TargetDir)" "$(TargetDir)$(ConfigurationName)\" /Y /I
您可能需要适应您的确切需求,过滤文件等

dpiehjr4

dpiehjr44#

Directory.Build.props在这方面非常强大。
可以在Directory.Build.props文件中设置。
您可能会发现必须删除csproj文件中已有的一个或多个值,才能使Directory.Build.props中的值生效。这是因为,项目文件中的值通常会覆盖Directory. Build. props中的值。$(Configuration)变量可以用作Directory.Build.props文件中的一部分。
您也可以在Directory.Build.props中设置一个值,例如:然后在csproj文件的值中使用它,例如:

...
...
<OutputPath>$(OutputDirExample)\Debug\</OutputPath>
...
...
<OutputPath>$(OutputDirExample)\Release\</OutputPath>
...
...

https://learn.microsoft.com/en-us/visualstudio/msbuild/customize-by-directory?view=vs-2022

**重要提示:**在使用Directory.Build.props文件进行实验时,请在对Directory.Build.props文件进行任何更改后关闭并重新打开解决方案(.sln),以确保更新的Directory.Build.props文件生效(忘记这样做可能会导致数小时的混乱)。

相关问题