Ошибка генерации кода во время сборки dotnet - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь запустить protocf protocf во время процесса сборки 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.. ("protobuffing"), его там нет.Но если я запускаю dotnet build второй раз, то он запускает «protobuffing» сразу после всех выходных данных «Restore complete», и тогда все просто работает.(Причина < /dev/null заключается в том, что я запускаю это в Windows, где иногда Visual Studio блокирует содержимое в каталоге .vs, которое должно быть здесь безвредным, поэтому оно игнорируется.)

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

1 Ответ

0 голосов
/ 17 сентября 2018

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

...