Можно ли заставить MSBuild создать проект только один раз, независимо от свойств? - PullRequest
0 голосов
/ 03 мая 2018

В настоящее время я переносю большое решение из старого формата файла csproj в новый формат csproj. Я делаю это несколько проектов одновременно, поэтому у меня смешанная среда, в которой некоторые проекты используют старый формат файла проекта, а некоторые проекты используют новый формат файла проекта.

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

Проекты, которые, по-видимому, имеют проблемы параллелизма, являются проектами, на которые ссылаются другие проекты, где ссылочные проекты разделены между форматами файлов проекта.

Команда, которую я использую для создания проекта:

msbuild.exe /maxcpucount:6 /property:Configuration=Debug;Platform=x64 /t:Rebuild my.sln

Есть ли способ дать MSBuild команду на создание заданного проекта только один раз (независимо от свойств), пока я не смогу преобразовать все проекты в решении в новый формат файла проекта?

Обратите внимание, что сборка однопоточного кода устраняет проблемы параллелизма, но это значительно замедляет сборку, и проекты по-прежнему создаются несколько раз.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Только вы могли правильно решить эту проблему, поскольку у нас нет доступа к вашему коду. Но, как правило, MSBuild и все системы сборки работают по правилу, согласно которому «цель» сборки обрабатывается только один раз. Независимо от того, сколько проектов ссылаются на него.

Система сборки должна предоставлять пользователю язык для определения зависимостей между различными «целями». И затем это зависит от системы сборки, чтобы выяснить, в каком порядке встраивать эти вещи (т.е. называется топологической сортировкой). Начиная или начиная с создания наиболее независимых целей вплоть до наименее независимых.

Если что-то строится дважды, это может быть: 1. Ошибка в системе сборки. 2. Пользователь заставляет проект строить дважды.

В любом случае, рад, что вы разобрались.

0 голосов
/ 14 мая 2018

Это ошибка в MSBuild при обращении к проектам C ++ CLI из проектов с множественным таргетингом. Похоже, что они исправляют это.

Чтобы обойти ошибку, свойство можно удалить из ссылки, используя атрибут GlobalPropertiesToRemove:

<ProjectReference Include="..\B.CppCLILibrary\B.CppCLILibrary.vcxproj" GlobalPropertiesToRemove="TargetFramework" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...