Я хотел бы изменить каталог папок bin и obj, созданных из сборки Visual Studio 2022.
Например, проект по этому пути:
C:\Users\MyUserName\source\repos\SolutionName\ProjectName\ProjectName.csproj
Построил бы:
C:\Users\MyUserName\source\repos\SolutionName\ProjectName\bin C:\Users\MyUserName\source\repos\SolutionName\ProjectName\obj
Я хочу изменить путь для папок bin и obj на:
C:\Users\MyUserName\MyProjectsBuilds\SolutionName\ProjectName\bin C:\Users\MyUserName\MyProjectsBuilds\SolutionName\ProjectName\obj
Я уже нашел ответы, как это сделать в свойствах проекта, но хочу сделать это для всех решений и проектов.
Как я могу заставить Visual Studio 2022 делать это по умолчанию вместо того, чтобы изменять свойства всех проектов по отдельности?
@Behtash ошибается относительно размещения файла Directory.Build.props в каталоге установки под C:\Program Files. Это даже не имеет смысла, поскольку доступ к каталогу C:\Program Files ограничен. Этот ответ должен быть отклонен.
Файлы Directory.Build.props и Directory.Build.targets ищутся в родительских каталогах. Если файлы уже используются в дереве кода, ваш локальный файл не может быть импортирован.





1) Найдите каталог MSBuild:
C:\Program Files\Microsoft Visual Studio\2022\<YourEdition>\MSBuild\Current\Bin\MSBuild.exe
2) Создайте или отредактируйте файл Directory.Build.props в каталоге MSBuild:
C:\Program Files\Microsoft Visual Studio\2022\<YourEdition>\MSBuild
В этом каталоге создайте файл с именем Directory.Build.props, если он еще не существует, или отредактируйте его, если он существует.
3) Настройте файл Directory.Build.props: Откройте файл Directory.Build.props в текстовом редакторе (возможно, вам придется открыть редактор от имени администратора, чтобы сохранить изменения в этом каталоге).
<Project>
<PropertyGroup>
<!-- Define a base output path variable -->
<BaseOutputPath>C:\Users\MyUserName\MyProjectsBuilds\$(SolutionName)\$(MSBuildProjectName)\</BaseOutputPath>
<!-- Set the output paths for bin and obj folders -->
<BaseIntermediateOutputPath>$(BaseOutputPath)obj\</BaseIntermediateOutputPath>
<OutputPath>$(BaseOutputPath)bin\</OutputPath>
</PropertyGroup>
</Project>
4) Перезапустите Visual Studio.
ссылка: https://learn.microsoft.com/en-us/visualstudio/msbuild/customize-by-directory?view=vs-2022
Будет ли использоваться файл Directory.Build.props в каталоге установки Visual Studio? Это где-то задокументировано? (В документации нет вашей ссылки.)
Я попробовал, но это не сработало.
Если вы думаете о чем-то вроде Профили PowerShell, то в MSBuild нет эквивалентной функции. Но есть функции, которые можно использовать для удовлетворения ваших потребностей.
В качестве однорангового файла проекта, например. foo.csproj создайте файл .user, соответствующий имени проекта, например. foo.csproj.user. Этот файл специально предназначен для локальной настройки и должен быть исключен из системы контроля версий. (См. «.user-файл».)
Однако это индивидуально для каждого проекта. Вам потребуется создать и поддерживать отдельный файл .user для каждого проекта.
И для Directory.Build.props, и для Directory.Build.targets MSBuild всегда будет проходить по цепочке родительских каталогов и импортировать файл, если он найден.
Вы можете создать Directory.Build.props и/или Directory.Build.targets в C:\Users\MyUserName. Эти файлы будут найдены и использованы всеми проектами в подкаталогах C:\Users\MyUserName — если сначала не будет найден другой файл.
Хорошей идеей является реализация «многоуровневого слияния». По сути, настройте каждый файл Directory.Build.props и Directory.Build.targets, чтобы продолжить просмотр каталогов и цепочку импорта. Это хорошо, потому что наборы проектов могут использовать общие настройки.
В документации приведен следующий пример для Directory.Build.props:
<Import Project = "$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />
Это можно обобщить, чтобы оно работало как для Directory.Build.props, так и для Directory.Build.targets, используя свойство $(MSBuildThisFile) вместо жесткого кодирования имени файла.
Import выдаст ошибку, если атрибут Project пуст, т. е. возникнет ошибка, если выше не будет найден ни один файл.
Часто в верхней части дерева кода создается файл, который не просматривается выше. Это останавливает цепочку импорта и не выдает ошибку, но предотвращает использование «глобального» файла, находящегося за пределами дерева кода.
Однако Import может иметь условие, поэтому шаблон для файлов Directory.Build.props и Directory.Build.targets может быть:
<Project>
<PropertyGroup>
<ParentFile>$([MSBuild]::GetPathOfFileAbove('$(MSBuildThisFile)', '$(MSBuildThisFileDirectory)../'))</ParentFile>
</PropertyGroup>
<Import Project = "$(ParentFile)" Condition = "$(ParentFile) != '' and Exists($(ParentFile))" />
...
Чтобы обеспечить единообразие и разумность, я рекомендую всегда импортировать «родительский файл» вверху «дочернего файла».
Учитывая путь к каталогу проекта A\B\C с файлом Directory.Build.targets в каждом каталоге:
A\B\C\Directory.Build.targets будет найден первым и импортирован A\B\Directory.Build.targets.A\B\Directory.Build.targets импортирую A\Directory.Build.targets.A\Directory.Build.targets не найдет файл для импорта.Порядок содержимого файлов в проекте после импорта будет такой:
A\Directory.Build.targetsA\B\Directory.Build.targetsA\B\C\Directory.Build.targetsФайл ниже в дереве кода (и ближе к файлу проекта) может переопределить настройки из более высокого уровня в дереве кода. Это хороший общий шаблон, даже если он кажется противоречащим вашим потребностям.
Но вам также следует следовать «Рекомендациям MSBuild» и тестировать свойства перед их установкой.
Если в A\B\C\Directory.Build.targets используется следующее, а BaseOutputPath уже определено в A\Directory.Build.targets, значение не будет переопределено.
<PropertyGroup>
<BaseOutputPath Condition = "'$(BaseOutputPath)' == ''">$(USERPROFILE)</BaseOutputPath>
</PropertyGroup>
Я знаю, что это, вероятно, кажется немного самодельным, но оно очень гибкое, расширяемое и хорошо поддерживается MSBuild.
Создание «Directory.Build.props» в C:\Users\MyUserName работало нормально. Использование «многоуровневого слияния» кажется ненужным для того, что я хочу, но приятно об этом знать. Спасибо!
Как сказал @Behtash, вы можете использовать Directory.Build.props, чтобы установить выходной каталог. Создайте файл в папке решения,
Directory.Build.props, чтобы установить соответствующие свойства MSBuild в одном месте, чтобы применить их ко всем проектам в решение.