如何配置Visual Studio 2022以在另一个驱动器上构建项目?



我有一个系统,其中1tb的sata固态硬盘作为系统盘,256gb的M.2固态硬盘作为辅助数据盘/刮擦驱动器。我想将Visual Studio 2022配置为在这个临时驱动器(F:build)上的文件夹内创建所有项目构建目录(但不是项目本身)。据我所知,基于cmake的项目可以通过创建全局CMakeSettings.json模板来实现这一点;然而,我还没有找到任何基于msbuild的项目。是否可以配置MSBuild默认值来执行此操作?

我要做的一个文件夹树看起来像这样:

F:
|- foo
|- bar
|- build
|- Project1
|- Project2

MSBuild不是像CMake这样的构建脚本生成器。当你用Visual Studio或dotnet工具创建一个项目文件时,项目本身就是一个MSBuild脚本。项目文件应该是源代码控制的。这不是一个'scratch'文件。

一般来说,MSBuild项目使用一个"中间"目录和一个"输出"目录。默认中间目录为obj,输出目录为bin。可以通过更改BaseIntermediateOutputPathBaseOutputPath属性来更改这些默认值。(见常用属性和参数列表)

您可以使用Directory.Build全局设置或更改属性。道具文件。(参见自定义构建。)Directory.Build。props文件很早就导入了,这很重要,因为有许多属性是基于BaseIntermediateOutputPathBaseOutputPath属性定义的。

您可以创建一个Directory.Build。像这样的Props文件:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$([MSBuild]::GetPathOfFileAbove('$(MSBuildThisFile)', '$(MSBuildThisFileDirectory)../'))" />
<PropertyGroup>
<Acme-Drive Condition="'$(Acme-Drive)' == ''">F:</Acme-Drive>
<Acme-BuildDir Condition="'$(Acme-BuildDir)' == ''">$(Acme-Drive)build</Acme-BuildDir>
<BaseOutputPath Condition="'$(BaseOutputPath)' == ''">$(Acme-BuildDir)$(MSBuildProjectName)bin</BaseOutputPath>
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)' == ''">$(Acme-BuildDir)$(MSBuildProjectName)obj</BaseIntermediateOutputPath>
</PropertyGroup>
</Project>

关于MSBuild代码的一些注意事项:

  • MSBuild将搜索目录结构并加载第一个directory . build。找到Props文件。Import将搜索,如果存在则加载下一个文件。在创建Directory.Build时总是添加Import是一个很好的做法。props文件(或目录)。目标文件)。如果Directory.Build,导入链将继续工作。*文件在目录树中被添加或删除。
  • Acme-DriveAcme-BuildDir是自定义属性。'Acme-'用作前缀。前缀可以是适合您的组织或产品的任何内容。前缀既提供了较低的属性名称冲突的机会,并表明这是一个自定义属性。
  • Condition="'$(Acme-Drive)' == ''"测试该属性是否未设置。只有当Acme-Drive属性还没有值时,才会设置F:值。可以从其他文件和命令行重新定义和覆盖属性。例如,在MSBuild命令行中传递/p:"Acme-Drive=z:"将为那次运行切换驱动器。
  • $(MSBuildProjectName)属性的值是当前项目的名称。
  • 如果

  • 源代码的本地工作目录是C:reposMyProduct.
  • 上面的代码保存为C:reposMyProductDirectory.Build.props.
  • 项目文件:
    • C: 回购 MyProduct project1 Project1.csproj
    • C: 回购 MyProduct project1 Project2.csproj
  • 然后

  • 两个项目将使用相同的Directory.Build。道具文件。
  • 对于Project1,$(BaseOutputPath)将是F:build Project1 bin.
  • 对于Project2,$(BaseOutputPath)将是F:build Project2 bin.

相关内容

  • 没有找到相关文章

最新更新