MSBuild-Задать Свойства Для Решения

мы используем .NET 3.5 с VS2008. У меня есть решение с ~20 проектами в нем, и это число будет расти со временем, поскольку приложение растет и добавляет новые модули. Сегодня мне нужно было установить собственность на каждый проект. Мне пришлось редактировать каждый файл csproj добавить следующее:

  <Target Name="BeforeBuild">
    <CreateProperty Condition=" '$(SolutionDir)' != '' And '$(SolutionDir)' != '*Undefined*' " 
                    Value="$(SolutionDir)ToolsMSBuild">
      <Output TaskParameter="Value" PropertyName="AlToolPath" />
    </CreateProperty>
  </Target>

Это позволяет проектам находить компоновщик сборки (AL.exe), который хранится в моем исходном репозитории, так что сборка является машинной агностикой (может проверить и построить на любой машине с .NET без необходимости установки SDK). Решение построено на командной строке с использованием MSBuild разработчиками, установочными пакетными файлами, CCNet и др.

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

пожалуйста, дайте мне знать, если вы сделали что-то подобное или знаете способ установить свойство один раз на решение, которое может быть использовано несколькими проектами (включая .NET 4/VS2010, с которым у меня нет опыта). Помните, что мы используем MSBuild для создания файла sln, а не отдельных проектов.

3 ответов


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


я реализовал решение, предложенное @fatcat111 уже несколько раз. На этот раз я автоматизировал этот процесс с помощью NuGet-Общий.Реквизит. Пакет добавит общий файл реквизита на уровне решения и установив пакет в нескольких проектах одного и того же решения, свойства могут быть общими.

код на GitHub.


поскольку файлы решений не являются файлами MSBuild, вы не сможете выполнять такие операции. Вам остается только разобраться с этим или использовать главный файл msbuild вместо создания файла решения. Одним из вариантов может быть создание специальной конфигурации, используемой процессом сборки. А для файлов решений можно указать используемую конфигурацию.