Мы используем .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, но это не очень хорошо для меня, поскольку все существующие и будущие командные строки должны будут включать его. Я также подумал о том, чтобы вызвать цель target в первом построенном проекте, чтобы использовать пользовательскую задачу для установки переменной среды, и цель after в последнем проекте, чтобы удалить ее, но это казалось более тяжелым и хрупким, чем просто редактирование всех файлов проекта по отдельности .
Пожалуйста, дайте мне знать, если вы сделали что-то подобное или знаете способ установить свойство один раз для решения, которое может использоваться несколькими проектами (включая .NET 4 / VS2010, с которым у меня нет опыта). Помните, что для создания файла sln мы используем MSBuild, а не отдельные проекты.