2014-01-08 2 views
5

В Visual Studio с 2010 по 2013 год по умолчанию (например, при создании нового консольного приложения) новые решения выводят свой скомпилированный исполняемый файл в Solution name/Project name/bin/Debug/. Я хочу, чтобы они выводились в Solution name/Debug/, а также для всех других конфигураций сборки, таких как «Release».Как изменить исходный каталог сборки по умолчанию в Visual Studio?

Я могу сделать это вручную вдаваясь в свойствах каждого проекта, перейдя на вкладку Build, изменяя Output path от bin\Debug к ..\Debug. Я должен повторить это для каждого проекта и каждой конфигурации сборки.

После десятков решений мне немного надоело выполнять эту утомительную задачу вручную. Есть ли способ изменить выходной путь по умолчанию?

Решение, которое работает для Visual Studio 2013, является достаточным.

ответ

7

Это свойство определяется в каждом Visual Studio Project Template

Так, например, шаблон консольного приложения C# находится в

\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ProjectTemplates\CSharp\Windows\1033\ConsoleApplication\consoleapplication.csproj 

csproj является XML-файл, который можно редактировать по вашему желанию. Выходной каталог сборки определяет как это (для каждой конфигурации):

... 
<OutputPath>bin\Debug\</OutputPath> 
... 
<OutputPath>bin\Release\</OutputPath> 
... 

Если изменить этот файл, то он изменит все ваши будущие новые проекты приложений C# консоли. Вы также можете написать служебную программу, которая перечисляет все csproj в \Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ProjectTemplates и обновляет их соответственно.

+0

Спасибо, я думаю, что это то, что я ищу - Я попытаюсь посмотреть, работает ли это позже сегодня (извините за то, что вы так долго). – Superbest

+2

Вы действительно не должны изменять глобальные защищенные файлы. Фактически, это может нарушить обслуживание, так что если шаблоны будут обновлены для исправлений ошибок или новых функций, ваш измененный файл не будет обновляться. Вместо этого вы можете установить '' в свой собственный .csproj, и он перезапишет глобальную настройку (если импортировано первым). Это рекомендация в рамках проектов MSBuild. – Heath

+0

Я решил свою проблему, создав новый шаблон с набором выходных каталогов, как вы описали, спасибо! – Superbest

3

Это необязательно.

Один из проектов в вашем решении отмечен как проект запуска, выделенный жирным шрифтом в окне Solution Explorer. Проект EXE, например, приложение консоли. Вы использовали Project + Add Reference для добавления ссылок на другие проекты в решении, чтобы вы могли использовать библиотеки классов, которые эти проекты генерируют в приложении консоли.

Эти ссылки будут иметь свойство Copy Local для True.

Когда вы строите свой проект, MSBuild автоматически отправит скопирует сборки из своего каталога bin \ Debug в каталог bin \ Debug вашего приложения в режиме консоли, благодаря этой настройке Copy Local. И он достаточно умен, чтобы также посмотреть на зависимости этих библиотек классов и скопировать их.

Итак, после завершения сборки в каталоге bin \ Debug будет не только EXE-файл проекта консольного режима, но и также всем DLL, которые необходимо выполнить должным образом.

Есть несколько способов, что это может пойти не так, и MSBuild не может понять, что такая зависимость действительно существует. Довольно редко, вам, например, пришлось бы использовать Reflection в вашем коде для загрузки сборок (Assembly.Load() и друзей). Обходной путь для этого заключается в том, чтобы явно скопировать зависимость в событии после сборки. Вы не оставили в своем вопросе достаточного количества хлебных крошек, чтобы судить, действительно ли это проблема.

То, о чем вы просите, конечно, возможно, IDE просто не облегчает, потому что он не предназначен, чтобы предположить, что это было необходимо вообще. Вам нужно будет заменить параметр «Выходной путь сборки +» на, скажем, ..\Debug.Вы можете создать свой собственный шаблон проекта с уже установленным параметром. Создайте новый проект библиотеки классов, измените настройку и используйте File + Export Template, чтобы создать шаблон. Вы получите его в следующий раз при создании проекта.

Но, действительно, сначала узнайте, почему по умолчанию копия Локальная техника не работает на вас.

+0

имеет смысл выводить все проекты решения в 1 папку, это экономит время и пространство (думает о SSD), копируя вокруг зависимостей между внутренними решениями, поскольку они будут существовать только в одной выходной папке – Firo

+0

Это просто не был разработан MSBuild. Вы можете бороться с системой сборки, но она не очень продуктивна. И нет, вы не экономить время. Копирование выходных файлов сборки - это простая копия памяти на память, она работает на скорости более 10 ГБ/с на современной машине. Занимает половину миллисекунды, вы никогда этого не замечаете. Все приветствуют кеш файловой системы. Если вы все равно хотите это сделать, то MSBuild не остановит вас, просто перепутайте вас. –

+0

Я думаю, что я сформулировал свой вопрос таким образом, что он предполагает, что это действительно необходимо. Чтобы быть ясным, причина, по которой я хочу сделать это прямо сейчас (у меня могут быть другие причины в будущем), заключается в том, что мне нравится подавать входные файлы в программу и выводить вывод в файл, что означает, что я часто обращаюсь к этим файлам при отладке и развитие. Думаю, вы бы предположили, что я добавляю эти файлы в свой проект, редактирую их изнутри Visual Studio и позволяю им копировать во время сборки - звучит как хорошая идея, хотя мне придется немного подумать о том, решит ли она каждый вопрос у меня есть. – Superbest

1

Вместо того, чтобы изменять глобальный защищенный файл, вы можете создать свой собственный .targets файл, который изменяет <OutputPath>, но вы хотите импортировать его в свои проекты. Это также может устанавливать другие значения по умолчанию, которые вы, возможно, захотите изменить, и не хотите делать для каждого проекта. Все, что вам нужно было бы сделать в ваших файлах проекта, добавить что-то вроде верхнего (после корневого элемента, конечно):

<Import Project="$(SolutionDir)\Common.targets"/> 
+0

Это действительно не отвечает на вопрос, который, как мне кажется, у вас все еще есть ручное действие (даже не с использованием IDE). Можете ли вы объяснить, как автоматизировать добавление этого импорта во все ваши проекты «по умолчанию»? –

Смежные вопросы