Изменить путь по умолчанию для папок bin и obj в VS 2022

Я хотел бы изменить каталог папок 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, чтобы установить выходной каталог. Создайте файл в папке решения, Directory.Build.props, чтобы установить соответствующие свойства MSBuild в одном месте, чтобы применить их ко всем проектам в решение.

Dou Xu-MSFT 27.06.2024 04:31

@Behtash ошибается относительно размещения файла Directory.Build.props в каталоге установки под C:\Program Files. Это даже не имеет смысла, поскольку доступ к каталогу C:\Program Files ограничен. Этот ответ должен быть отклонен.

Jonathan Dodds 27.06.2024 14:31

Файлы Directory.Build.props и Directory.Build.targets ищутся в родительских каталогах. Если файлы уже используются в дереве кода, ваш локальный файл не может быть импортирован.

Jonathan Dodds 27.06.2024 14:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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? Это где-то задокументировано? (В документации нет вашей ссылки.)

Jonathan Dodds 26.06.2024 21:47

Я попробовал, но это не сработало.

Carlos Siestrup 27.06.2024 15:11
Ответ принят как подходящий

Если вы думаете о чем-то вроде Профили PowerShell, то в MSBuild нет эквивалентной функции. Но есть функции, которые можно использовать для удовлетворения ваших потребностей.

.user-файл

В качестве однорангового файла проекта, например. foo.csproj создайте файл .user, соответствующий имени проекта, например. foo.csproj.user. Этот файл специально предназначен для локальной настройки и должен быть исключен из системы контроля версий. (См. «.user-файл».)

Однако это индивидуально для каждого проекта. Вам потребуется создать и поддерживать отдельный файл .user для каждого проекта.

Directory.Build.props и Directory.Build.targets

И для 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 в каждом каталоге:

  1. A\B\C\Directory.Build.targets будет найден первым и импортирован A\B\Directory.Build.targets.
  2. A\B\Directory.Build.targets импортирую A\Directory.Build.targets.
  3. A\Directory.Build.targets не найдет файл для импорта.

Порядок содержимого файлов в проекте после импорта будет такой:

  1. A\Directory.Build.targets
  2. A\B\Directory.Build.targets
  3. A\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 работало нормально. Использование «многоуровневого слияния» кажется ненужным для того, что я хочу, но приятно об этом знать. Спасибо!

Carlos Siestrup 28.06.2024 02:15

Другие вопросы по теме