Как мне выполнить локальную детерминированную сборку (флаг ContinuousIntegrationBuild)?

#visual-studio #visual-studio-2019 #nuget-package #roslyn #.net-standard

#visual-studio #visual-studio-2019 #nuget-package #roslyn #.net-стандартный

Вопрос:

Когда я пытаюсь опубликовать свой пакет с помощью NuGet Package Explorer, я вижу следующее предупреждение:

Недетерминированный

Детерминированный (dll / exe): недетерминированный
Убедитесь, что для сборок CI включено следующее свойство
и вы используете по крайней мере пакет 2.1.300 SDK:

 <ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>
  

Однако, когда я добавляю это свойство в PropertyGroup (как описано здесь), VS 2019 выходит из себя настолько сильно, что мне буквально нужно ctrl alt delete, чтобы закрыть его.

Согласно этой странице, имя свойства — <Deterministic> , но, похоже, это вообще ничего не делает.

Итак, как мне заставить детерминированные сборки работать?

Visual Studio 2019, версия 16.7.1
.Net SDK 3.1.401 (LTS)

Комментарии:

1. Можете ли вы опубликовать некоторые из ошибок, которые вы видите? В нынешнем виде на этот вопрос невозможно ответить. Детерминированный вариант, на который вы ссылаетесь, касается детерминированности компилятора (официальные документы здесь ). Этот флаг включен по умолчанию в любом проекте .NET Core, и поэтому указание его в вашем файле проекта ничего не даст.

2. @JonathonMarolf: Я уже опубликовал ошибки, которые я вижу. Когда вы включаете флаг в локальных сборках, Visual Studio зависает при сборке и ее необходимо принудительно закрыть.

3. @BlueRaja-DannyPflughoeft Файл default .csproj, созданный VS v16.7.1 для консольного приложения C #, находится <Deterministic>true</Deterministic> вверху <PropertyGroup> , и он отлично создается локально. Итак, я предполагаю, что в файлах вашего проекта должно быть какое-то другое различие.

4. что происходит при сборке из командной строки? Я полагаю, что свойства Clair будут работать только в проекте в стиле sdk (тип, созданный для проекта .NET Core).

5. что ContinuousIntegrationBuild на самом деле делает, когда установлено?

Ответ №1:

Более простой ответ — не связываться с .csproj файлами (тьфу!) и сделать это через командную строку в вашем скрипте CI.

добавьте /p:ContinuousIntegrationBuild=true аргумент в dotnet pack команду.

 dotnet pack 
    -c $env:CONFIGURATION 
    /p:ContinuousIntegrationBuild=true 
    -p:PackageVersion=$env:APPVEYOR_BUILD_VERSION
  

(сделайте все это одной строкой. Я разбил ее на несколько разделов для удобства чтения)

ПРИМЕЧАНИЕ: --no-build аргумента здесь НЕТ. Нам нужно собрать это снова. Или вы добавляете этот параметр на этапе сборки перед этим.

Это взято из примера файла CI, который я использую. Итак, когда я нахожусь в release режиме, я упаковываю библиотеку в nuget и публикую ее.

Сохраняет все в чистоте и из вашего .csproj файла (что очень сложно проверить и поддерживать).

Комментарии:

1. Это сделало это за меня. Спасибо @Pure.Krome

2. Как поднятая вами проблема влияет на этот ответ, он все еще действителен?: github.com/dotnet/sdk/issues/16325

Ответ №2:

Я в основном только что нашел ответ в этом сообщении в блоге:

Хотя детерминированные сборки включены по умолчанию в проектах .NET SDK, на сервере сборки можно установить дополнительное свойство ContinuousIntegrationBuild для нормализации путей к сохраненным файлам. Они не должны быть включены во время локальной разработки, иначе отладчик не сможет найти локальные исходные файлы.

 <PropertyGroup Condition="'$(TF_BUILD)' == 'true'">
  <ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>
</PropertyGroup>
  

Комментарии:

1. Установка этой переменной не имела для меня никакого значения: я все еще получаю то же самое предупреждение при просмотре пакета с помощью NuGet Package Explorer. Пробовал как устанавливать для нее значение true всегда (в качестве теста), так и компилировать из cmdline, используя пользовательскую переменную типа TF_BUILD .

2. Для меня использование ContinuousIntegrationBuild также не работает

3. Мне пришлось включить sourcelink, включив соответствующий пакет для моего управления версиями, а затем я получил все зеленые галочки в nuget package explorer