Вопрос по nuget, stylecop, msbuild – Тайна застрявших неактивных процессов msbuild.exe, заблокированных стилей Stylecop.dll, Nuget AccessViolationException и CI, конфликтующих друг с другом

56

Замечания:

На нашем сервере сборки Jenkins мы видели множество процессов msbuild.exe (~ 100), зависших после завершения задания, с использованием около 20 МБ памяти и 0% активности процессора.

Сборки с использованием разных версий stylecop былис перерывами неудача:

workspace\packages\StyleCop.MSBuild.4.7.41.0\tools\StyleCop.targets(109,7): error MSB4131: The "ViolationCount" parameter is not supported by the "StyleCopTask" task. Verify the parameter exists on the task, and it is a gettable public instance property.

Nuget.exe былс перерывами выход со следующей ошибкой нарушения прав доступа (0x0000005):

.\workspace\.nuget\nuget install .\workspace\packages.config -o .\workspace\packages" exited with code -1073741819.

MsBuild был запущен следующим образом через задание Jenkins Matrix сBuildInParallel» включено:

    `msbuild /t:%Targets% /m
    /p:Client=%Client%;LOCAL_BUILD=%LOCAL_BUILD%;BUILD_NUMBER=%BUILD_NUMBER%;
    JOB_NAME=%JOB_NAME%;Env=%Env%;Configuration=%Configuration%;Platform=%Platform%;
    Clean=%Clean%; %~dp0\_Jenkins\Build.proj`
Пониженное голосование без комментариев. Спасибо! Jon Rea
Голосование и одобрение, потому что такого рода вещи я)самый раздражающий вид проблемы, с которой приходится сталкиваться на работе разработчика и ii) наименее вероятно, будет легко решить с помощью Google. Tom W

Ваш Ответ

3   ответа
1

которую я нашел, была в файлах csproj

<propertygroup>
<stylecopmsbuildtargetsfile>..\packages\StyleCop.MSBuild.4.7.48.0\tools\StyleCop.targets</stylecopmsbuildtargetsfile>
</propertygroup>

Также я удалил весь "Пакеты» папка, которая 'находится в той же папке, что и файл sln после того, как я закрыл визуальную студию. Он вызвал VS, чтобы перестроить папку и освободить кеш старой версии stylecopI '

0

сборка заняла более 6 минут, после некоторого копания я нашел нашОшибка повторного использования узла s, поэтому добавление / m: 4 / nr: false решает мою проблему немедленно

67

много копаться и пробовать разные вещи безрезультатно, в конце концов я создал новое минимальное решение, которое воспроизвело проблему с очень немногим происходящим. Проблема оказалась вызвана msbuild 'с многоядерным распараллеливанием - «м» параметр.

М параметр указывает msbuild для появления "узлы», они останутся живыми после того, как сборка закончилась, и затем будут повторно использоваться новыми сборками!StyleCop 'ViolationCount» ошибка была вызвана тем, что данная сборка повторно использовала старую версию stylecop.dll из другой сборки 'Рабочая область, где ViolationCount не поддерживается. Это было странно, потому что рабочая область CI содержала только новую версию. Кажется, что после того, как StyleCop.dll был загружен в данный узел MsBuild, он останется загруженным для следующей сборки. Я могу только предположить, что это потому, что StyleCop загружает какой-то синглтон в процессах узлов? Это также объясняет блокировку файлов между сборками.Сбой нарушения доступа Nuget теперь исчез (без каких-либо других изменений), поэтому он, очевидно, связан с проблемой повторного использования вышеупомянутого узла.Как "м" параметр по умолчанию равен числу ядер - мы видели24 msbuild экземпляры, созданные на нашем сервере сборки для данной работы.

Следующие посты были полезны:

msbuild.exe остается открытым, блокировка файловhttp://www.hanselman.com/blog/FasterBuildsWithMSBuildUsingParallelBuildsAndMulticoreCPUs.aspxhttp://stylecop.codeplex.com/discussions/394606https://github.com/Glimpse/Glimpse/issues/115http://msdn.microsoft.com/en-us/library/vstudio/ms164311.aspx

Исправление:

Добавьте строкуset MSBUILDDISABLENODEREUSE=1 в командный файл, который запускает msbuildЗапустите msbuild с помощью/m:4 /nr:false'NR» paremeter говорит msbuild не использовать "Узел повторного использования " - поэтому экземпляры msbuild закрываются после завершения сборки и больше не конфликтуют друг с другом, что приводит к вышеуказанным ошибкам.М для параметра задано значение 4, чтобы остановить слишком много узлов, порождаемых на задание '
Я также получил эту точную ошибку ./m:4 / nr: false работал отлично для меня. Mangesh Pimpalkar
Я сталкиваюсь с гораздо более простой ситуацией. Запустите VS, оставив много процессов msbuild. Трюк env решает проблему. toddwz
Является ли установка MSBUILDDISABLENODEREUSE = 1 и передача / nr: false в msbuild.exe избыточной? Вы можете сделать одно или другое? Antonio Maiorano
Не могли бы вы уточнить, как / где на самом деле применить исправление? Evgeny Lukiyanov

Похожие вопросы