Ошибка генерации кода во время сборки 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
 ('$(MSBuildVersion)' != '' and
 $([System.Version]::Parse($(MSBuildVersion))) >= $([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" до "Восстановления", и инструменты прото не существовали при первом запуске. Я удалил целевой объект "Восстановление", и сборка была выполнена без каких-либо проблем.