我有一个系统,其中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
。可以通过更改BaseIntermediateOutputPath
和BaseOutputPath
属性来更改这些默认值。(见常用属性和参数列表)
您可以使用Directory.Build全局设置或更改属性。道具文件。(参见自定义构建。)Directory.Build。props文件很早就导入了,这很重要,因为有许多属性是基于BaseIntermediateOutputPath
和BaseOutputPath
属性定义的。
您可以创建一个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-Drive
和Acme-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.