MSBuild - настройка свойств для решения

Мы используем .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 файла, а не для отдельных проектов.

Ответ 1

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

Ответ 2

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

Код находится на GitHub.

Ответ 3

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