Вопрос:
В Visual Studio 2010 до 2013 по умолчанию (например, при создании нового консольного приложения) новые решения выводят свой скомпилированный исполняемый файл в Solution name/Project name/bin/Debug/. Я хочу, чтобы они выводились в Solution name/Debug/, а также для всех других конфигураций сборки, таких как “Release”.
Я могу сделать это, вручную перейдя в свойства каждого проекта, перейдя на вкладку Build, изменив Output path с binDebug на ..Debug. Я должен повторить это для каждого проекта и каждой конфигурации сборки.
После десятков решений мне немного надоело делать эту утомительную задачу вручную. Есть ли способ изменить выходной путь по умолчанию?
Решение, которое работает для Visual Studio 2013, достаточно.
Лучший ответ:
Это свойство определено в каждом шаблоне проекта Visual Studio
Итак, например, шаблон приложения консоли С# находится в
Program Files (x86)Microsoft Visual Studio 11.0Common7IDEProjectTemplatesCSharpWindows1033ConsoleApplicationconsoleapplication.csproj
Csproj – это XML файл, который вы можете редактировать по своему желанию. Каталог вывода сборки определяется следующим образом (для каждой конфигурации):
… <OutputPath>binDebug</OutputPath> … <OutputPath>binRelease</OutputPath> …
Если вы измените этот файл, он изменит все ваши будущие новые проекты приложений консоли С#. Вы также можете написать служебную программу, которая перечисляет все csproj в Program Files (x86)Microsoft Visual Studio 11.0Common7IDEProjectTemplates и соответственно обновлять их.
Ответ №1
Это необязательно.
Один из проектов в вашем решении отмечен как проект запуска, выделенный жирным шрифтом в окне Solution Explorer. Проект EXE, например, приложение консоли. Вы использовали Project + Add Reference для добавления ссылок на другие проекты в решении, чтобы вы могли использовать библиотеки классов, которые эти проекты генерируют в приложении консоли.
Эти ссылки будут иметь свойство Copy Local равным True.
Когда вы создадите проект, MSBuild автоматически скопирует сборки из своего каталога binDebug в каталог binDebug вашего приложения в режиме консоли, благодаря настройке Copy Local. И он достаточно умен, чтобы также смотреть на зависимости этих библиотек классов и копировать их также.
Итак, после завершения сборки каталог binDebug будет не просто иметь EXE файл проекта в консольном режиме, но также все DLL, необходимые для его выполнения.
Есть несколько способов, что это может пойти не так, и MSBuild не может понять, что такая зависимость действительно существует. Довольно редко, вам, например, пришлось бы использовать Reflection в вашем коде для загрузки сборок (Assembly.Load() и друзей). Обходной путь для этого заключается в том, чтобы явно скопировать зависимость в событии после сборки. Вы не оставили в своем вопросе достаточно хлебных крошек, чтобы судить, действительно ли это проблема.
То, о чем вы просите, конечно, возможно, IDE просто не облегчает, потому что он не предназначен, чтобы предположить, что это было необходимо вообще. Вам нужно будет заменить параметр “Путь сборки +” на, скажем, ..Debug. Вы можете создать свой собственный шаблон проекта с уже установленным параметром. Создайте новый проект библиотеки классов, измените настройку и используйте File + Export Template, чтобы создать шаблон. Вы получите его в следующий раз при создании проекта.
Но, действительно, сначала выясните, почему не работает для вас механизм Copy Local по умолчанию.
Ответ №2
Вместо изменения глобального защищенного файла вы можете создать свой собственный файл .targets, который изменяет <OutputPath>, но вы хотите и импортируете его в свои проекты. Это также может устанавливать другие значения по умолчанию, которые вы, возможно, захотите изменить, и не хотите делать для каждого проекта. Все, что вам нужно сделать в ваших файлах проекта, – добавить что-то вроде верха (после корневого элемента, конечно):
<Import Project=»$(SolutionDir)Common.targets»/>