Ошибка генерации кода во время сборки dotnet

Я пытаюсь запустить Protobuf Protoc во время процесса сборки DotNet с DotNet Core 2.1 (казалось, более или менее работает с 2.0, но мы хотим воспользоваться преимуществами 2.1). .csproj У файла есть украденный фрагмент для запуска этого:

  <!-- https://github.com/protocolbuffers/protobuf/issues/3820#issuecomment-399538660 -->
  <PropertyGroup>

    <protoc_linux64>tools\linux_x64\protoc</protoc_linux64>
    <protoc_linux86>tools\linux_x86\protoc</protoc_linux86>
    <protoc_macosx64>tools\macosx_x64\protoc</protoc_macosx64>
    <protoc_macosx86>tools\macosx_x86\protoc</protoc_macosx86>
    <protoc_windows64>tools\windows_x64\protoc.exe</protoc_windows64>
    <protoc_windows86>tools\windows_x86\protoc.exe</protoc_windows86>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(MSBuildRuntimeType)' == 'Core' or&#xD;&#xA;                 ('$(MSBuildVersion)' != '' and&#xD;&#xA;                 $([System.Version]::Parse($(MSBuildVersion))) &gt;= $([System.Version]::Parse(15.3))) ">
    <protoc Condition="'$([MSBuild]::IsOsPlatform(Linux))' And '$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture)'=='X64'">$(protoc_linux64)</protoc>
    <protoc Condition="'$([MSBuild]::IsOsPlatform(Linux))' And '$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture)'=='X86'">$(protoc_linux86)</protoc>
    <protoc Condition="'$([MSBuild]::IsOsPlatform(OSX))' And '$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture)'=='X64'">$(protoc_macosx64)</protoc>
    <protoc Condition="'$([MSBuild]::IsOsPlatform(OSX))' And '$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture)'=='X86'">$(protoc_macosx86)</protoc>
    <protoc Condition="'$([MSBuild]::IsOsPlatform(Windows))' And '$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture)'=='X64'">$(protoc_windows64)</protoc>
    <protoc Condition="'$([MSBuild]::IsOsPlatform(Windows))' And '$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture)'=='X86'">$(protoc_windows86)</protoc>
  </PropertyGroup>

  <Target Name="BuildProto" BeforeTargets="Compile;Restore">
    <ItemGroup>
      <Protos Include="$(ProjectDir)Protobuf\Protos\*.proto" />
    </ItemGroup>
    <Message Importance="high" Text="protobuffing" />
    <Exec Command="$(NuGetPackageRoot)google.protobuf.tools\3.6.1\$(protoc) --proto_path=$(ProjectDir) --csharp_out=$(ProjectDir)Protobuf\ --csharp_opt=file_extension=.g.cs @(Protos, ' ')" />
  </Target>

Когда это работает, это работает. .g.cs файлы генерируются, все отлично. Но если я начну с чистой сборки и буду запускать сборку в соответствии с решением, то .g.cs файлы не генерируются. Очевидно, что после этого сборка завершается сбоем, поскольку все, что генерируется, не может быть найдено.

git clean -dxf < /dev/null ; dotnet build MySolution.sln -m:1

Когда я ищу выход для <Message.. text ("protobuffing"), его там нет. Но если я бегу dotnet build во второй раз он запускает "protobuffing" сразу после всех выходных данных "Restore complete", и тогда все просто работает. (Причина < /dev/null это то, что я запускаю это в Windows, где иногда Visual Studio блокирует содержимое в каталоге.vs, что должно быть здесь безвредным, поэтому его игнорируют.)

Я полагаю, я мог бы настроить сервер сборки CI для запуска сборки dotnet дважды, но это кажется мне взломом. Я просто ищу способ получить dotnet build в сетевом ядре 2.1, чтобы запустить эту цель перед сборкой кода C# для этой сборки.

1 ответ

Решение

Я думаю, что проблема здесь: <Target Name="BuildProto" BeforeTargets="Compile;Restore">, Вы использовали целевой объект "BuildProto" до "Восстановления", и инструменты прото не существовали при первом запуске. Я удалил целевой объект "Восстановление", и сборка была выполнена без каких-либо проблем.

Другие вопросы по тегам