Мы используем .NET 3.5 с VS2008. У меня есть решение с ~ 20 проектами в нем, и это число со временем будет расти по мере роста приложения и добавления новых модулей. Сегодня мне нужно было установить свойство для каждого проекта. Мне пришлось отредактировать каждый файл csproj, чтобы добавить следующее:
<Target Name="BeforeBuild">
<CreateProperty Condition=" '$(SolutionDir)' != '' And '$(SolutionDir)' != '*Undefined*' "
Value="$(SolutionDir)Tools\MSBuild">
<Output TaskParameter="Value" PropertyName="AlToolPath" />
</CreateProperty>
</Target>
Это позволяет проектам находить компоновщик компоновки (AL.exe), который хранится в моем исходном репозитории, так что сборка не является агностикой (можно проверить и построить на любой машине с .NET без установки SDK). Решение построено на командной строке, используя MSBuild разработчиками, устанавливая пакетные файлы, CCNet и т.д.
В любом случае, я искал лучший способ сделать это (например, что-то вроде свойств уровня решения), но не смог найти его. Я знаю, что можно установить значение свойства в командной строке MSBuild, но это не масштабируется для меня, поскольку все существующие и будущие командные строки должны включать его. Я также думал о вызове перед мишенью в первом построенном проекте, чтобы использовать настраиваемую задачу для установки переменной окружения, и после цели в последнем проекте, чтобы удалить ее, но это казалось более тяжелым и хрупким, чем просто редактирование всех файлов проекта по отдельности.
Пожалуйста, дайте мне знать, если вы сделали что-то подобное или знаете способ установить свойство один раз для решения, которое может использоваться несколькими проектами (включая .NET 4/VS2010, с которыми у меня нет опыта). Помните, что мы используем MSBuild для создания sln файла, а не для отдельных проектов.