Эталонный проект Visual Studio 2019 C ++ не был создан до того, как зависимый проект попытается связать в конфигурации выпуска с помощью MSBuild

У меня есть решение, которое содержит проекты C ++ и C #, встроенные в ночную сборку CI на удаленном компьютере. Сценарий сборки проверяет чистую копию источника и создает конфигурации отладки и выпуска решения с помощью MSBuild и запускает набор тестов для каждой конфигурации.

Что касается каждой второй сборки, конфигурация выпуска не может быть правильно построена. Анализ журнала сборки показывает, что C ++ Project Q, который зависит от C ++ Project D, пытается установить связь до завершения Project D. Эта ошибка возникает только для конфигурации выпуска на этом конкретном компьютере сборки - конфигурация отладки строится без ошибок. У меня есть отдельный процесс ночной сборки, который выполняется на отдельном компьютере, где конфигурация выпуска создается с помощью аналогичного сценария, который использует MSBuild (он просто не запускает набор тестов), и он без проблем создает ту же исходную ревизию. Несколько членов команды создают решение без проблем с помощью обновления или чистой проверки с одной или обеими конфигурациями, всегда из среды разработки Visual Studio 2019, в различных операционных системах.

Project Q настроен с использованием Project D в качестве ссылки на проект, а Project D также указан как жесткая зависимость для Project Q. Как я уже упоминал, сценарий сборки использует MSBuild.

Дополнительный интересный момент из анализа журналов сборки выпуска и отладки: сборка Project D запускается по-разному между двумя сборками конфигурации. Он запускается собственным метапроектом в конфигурации выпуска (например, как элемент 60), но запускается раньше (например, как элемент 44) другим проектом в конфигурации отладки. Не уверен, почему алгоритм зависимости будет работать с такими разными результатами в двух случаях, поскольку создаваемое решение и рабочий источник одинаковы.

Любые идеи или предложения будут оценены.

Обновление. Проверка различий между журналами выпуска и отладочной сборки позволяет выявить некоторые интересные факты. В случае сбоя я выполнил поиск «) строится» в каждом журнале - должно быть указание на то, сколько проектов было построено, включая записи метапроекта. Для случая сбоя отладка имела 282 вхождения, тогда как выпуск - 175. В случае успеха отладка имела 280 вхождений, а выпуск - колоссальные 559! Подобный поиск по запросу «Готовый проект строительства» дает аналогичные результаты, только с точностью до 1 или 2. Это может частично объяснить различия в порядке сборки между решениями. Мне также нужно проверить записи условной сборки.


person GTAE86    schedule 11.05.2020    source источник
comment
Использовали ли вы зависимость проекта (щелкните проект правой кнопкой мыши - ›Зависимости сборки) или ссылку на проект (щелкните правой кнопкой мыши на ссылке -› Добавить ссылку) для создания ссылки на проект? Кроме того, вы вносили какие-либо изменения в свой текущий проект? Если вы используете MSBuild для сборки проекта, вы должны использовать ссылку на проект, а также убедиться, что у вас нет условий, позволяющих различать режим отладки и режим выпуска.   -  person Mr Qian    schedule 12.05.2020
comment
При необходимости мы используем ссылки на проекты. В некоторых случаях этого недостаточно (например, процесс сборки проекта X зависит от инструмента, проекта M - тогда мы добавим зависимость от X для M). В этом конкретном случае проект-нарушитель Q имеет проект D как ссылку на проект и как явную зависимость. Кроме того, доказано, что решение настроено правильно, поскольку идентичный исходный код строится для одной и той же конфигурации на отдельном компьютере с использованием одного и того же сценария. Не говоря уже о том, что конфигурация отладки строится на том же компьютере непосредственно перед тем, как конфигурация выпуска не удалась.   -  person GTAE86    schedule 12.05.2020


Ответы (1)


Эталонный проект Visual Studio 2019 не был создан до того, как зависимый проект попытается связать в конфигурации выпуска с помощью MSBuild

Похоже, что порядок сборки проекта был нарушен, и проект D построен позже, чем проект Q, которому требуется выходной контент проекта D, поэтому вся сборка не удалось.

Не уверен, что если вы используете Project Dependency (щелкните правой кнопкой мыши проект -> _ 1 _--> _ 2_), то только VS IDE Build распознает их порядок сборки, в то время как командная строка MSBuild потеряет отношения о них.

Кроме того, мне интересно, ссылается ли ваш основной проект в режиме выпуска на зависимый проект в режиме выпуска. Если вы это сделали, сборка определенно пойдет не так.

Все это говорит о том, что, я думаю, вы внесли некоторые изменения в свой проект.

Вы можете выполнить следующие шаги:

1) Я предлагаю вам попробовать использовать Справочник по проекту, и он добавит этот xml-узел в ProjectQ.csproj файл, чтобы четко указать взаимосвязь между сборками:

<ItemGroup>
    <ProjectReference Include="..\ProjectD\ProjectD.csproj">
      <Project>{26c26cdd-a5e0-40c7-b0c9-4563f969424f}</Project>
      <Name>ProjectD</Name>
    </ProjectReference>
 </ItemGroup>

Также проверьте, существуют ли какие-либо условия, которые различают режим отладки или выпуска при обращении к подобному проекту:

<ProjectReference Include="..\ProjectD\ProjectD.csproj" Condition="'$(Configuration)'=='Debug'">

Если да, удалите это условие Condition="'$(Configuration)'=='Debug'", чтобы убедиться, что оно одинаково для режимов отладки и выпуска.

2) закройте экземпляр VS, удалите .vs скрытую папку в папке решения.

3) проверьте свой CI Build и сервер сборки облака и убедитесь, что параметры облака соответствуют параметрам других серверов. И проверьте любой из ваших xxx.csproj файлов, чтобы проверить, есть ли у вас какие-либо другие операции, вызывающие такое поведение.

Кроме того, если необходимо, вы можете поделиться с нами своим xxx.csproj файлом и сценарием сборки для устранения неполадок.

person Mr Qian    schedule 12.05.2020
comment
Спасибо за комментарий. 1) - см. Мой комментарий выше - с использованием ссылок на проекты и т. Д. Кроме того, проверка одной и той же ревизии на другом компьютере правильно строится для конфигурации выпуска с использованием того же сценария. Пункт 2) - это чистые кассы. Рабочий каталог удаляется на первом этапе. Пункт 3) - Насколько мне известно, в петле нет облака. Также решение представляет собой смесь проектов C ++ и C #; проблема в C ++. Одна вещь, которую я сделал вчера на ошибочной машине сборки, - это обновление VS 2019 16.4.5 до 16.5.4. Конечно, вчера вечером он построился правильно, но это может быть не связано. - person GTAE86; 12.05.2020
comment
Я проверю условия между конфигурациями отладки и выпуска. Диспетчер конфигурации кажется одинаковым для обоих. Я также добавил несколько деталей к вопросу. - person GTAE86; 12.05.2020
comment
Что касается всего вышеперечисленного, я думаю, что вы внесли некоторые изменения в свой проект. - не уверен, что понимаю. Какие изменения и когда? Скрипт удаляет рабочий каталог, затем проверяет источник. Строит отладочную конфигурацию решения с помощью MSBuild, запускает модульные тесты. Затем он создает конфигурацию выпуска (то же решение) с помощью MSBuild, запускает модульные тесты. Если вы имеете в виду возможную разницу между выпуском / отладкой, возможно, из-за некоторых условий в решении, может быть, но не намеренно. Я перенес это решение из VS 2003 в VS 2019 за 19 лет - хорошо с ним знаком :) - person GTAE86; 12.05.2020
comment
На самом деле, действительно существует случайная сборка msbuild, то есть беспорядочная сборка. Эта проблема действительно редка, но существует, и это действительно известная проблема. Поэтому, если вы хотите выполнить этот шаг, я предлагаю вам попробовать указать порядок для каждого элемента, см. Способ этот документ ---- добавьте такой узел в xxx.sln файл. - person Mr Qian; 14.05.2020