Как установить выходной путь нескольких визуальных проектов С#

У меня есть решение, которое содержит несколько проектов С#, и я хотел бы иметь возможность устанавливать выходной путь и другие свойства для всех проектов вместе в одном месте. Пакеты свойств (vsprops), похоже, не доступны для проектов С#, а переменная $(SolutionDir) игнорируется. Существуют ли какие-либо другие методы для установки свойств в нескольких проектах С#?

Обновление Следуя информации в ответе Bas Bossink, я смог установить путь вывода нескольких проектов, создав общий csproj и импортировав его в отдельный проект. Несколько других моментов:

  • При создании в Visual Studio, если изменения внесены в общий проект, необходимо коснуться/перезагрузить любые проекты, которые ссылаются на него для внесения изменений.
  • Любые свойства, которые также заданы в отдельном проекте, переопределяют общие свойства.
  • Установка $(SolutionDir) в качестве выходного пути через интерфейс Visual Studio не работает должным образом, потому что значение рассматривается как строковый литерал, а не расширяется. Тем не менее, установка $(SolutionDir) непосредственно в файл csproj с текстовым редактором работает как ожидалось.

Ответ 1

Файл csproj уже является файлом msbuild, это означает, что файлы csproj также могут использовать элемент импорта, как описано здесь. Элемент импорта именно то, что вам нужно. Вы можете создать Common.proj, который содержит что-то вроде:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5"xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
    <OutputPath>$(SolutionDir)output</OutputPath>
    <WarningLevel>4</WarningLevel>
    <UseVSHostingProcess>false</UseVSHostingProcess>
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
</Project>

Вы можете импортировать этот Common.proj в каждый из ваших csprojs, например, так:

<Import Project="..\Common.proj" />

Оператор import должен предшествовать любым задачам, зависящим от свойств, определенных в Common.proj

Надеюсь, это поможет. Я не могу подтвердить свои проблемы с переменной $(SolutionDir), которую я использовал много раз. Однако я знаю, что эта переменная не устанавливается, когда вы запускаете команду msbuild через командную строку в конкретном проекте, который содержится в решении. Он будет установлен при создании вашего решения в Visual Studio.

Ответ 2

К сожалению, эти биты информации, такие как выходной путь, хранятся внутри отдельных файлов *.csproj. Если вы хотите пакетно обновить целую кучу, вам придется вернуться к некоторому инструменту обновления текста или создать script, чтобы коснуться каждого из этих файлов.

Для таких вещей (применить изменения к кучке текстовых файлов сразу) я лично использую WildEdit от Helios Software - работает как шарм и по разумной цене.

Но я уверен, что там есть много бесплатных альтернатив.

Ответ 3

Я бы предложил вам использовать инструмент построения, например MSBuild или NAnt, что придаст вам большую гибкость в ваших сборках. В основном идея состоит в том, чтобы начать сборку, используя (в большинстве случаев) один настраиваемый файл сборки.

Я бы лично рекомендовал NAnt.

Вы можете найти потрясающий учебник по NAnt в блоге JP Boodhoo здесь

Ответ 4

Задайте свойство $(OutputPath) в общей таблице свойств. Затем удалите эту запись во всех файлах проекта, на которые вы хотите повлиять. Затем импортируйте эту страницу свойств во все ваши проекты.

Для сотен проектов, которые могут быть очень утомительными. Вот почему я написал инструмент, помогающий с этим:

https://github.com/chris1248/MsbuildRefactor