9개의 좋아요
https://docs.bebop.sh/guide/getting-started-csharp/
새로운 것을 알았으니 확인 해볼 필요가 있습니다.
관련된 패키지를 설치하고,
dotnet add package bebop
dotnet add package bebop-tools
bop 스키마(.bop)
를 이용해 .cs
파일을 생성하기 위해 다음을 구성합니다.
<ItemGroup>
<Bebop Include="**/*.bop" OutputDir="./Models/" OutputFile="Models.g.cs" Namespace="BebopTest.Models" />
</ItemGroup>
그런 후 bop 파일을 생성하고
| Models.bop
struct Hello {
int32 x;
int32 y;
}
컴파일 하는데 아~무런 반응이 없었습니다. 원인을 찾기 위해 bebop-tools
의 빌드 파일을 확인, 프로젝트 설정에 다음을 추가하면 디버그 정보가 표시된다는 것을 확인하고
<Target Name="BebopPrepareForBuildDebug" AfterTargets="PrepareForBuild">
<CallTarget Targets="BebopPrepareForBuildDiagnostic"/>
</Target>
결과를 확인했더니 다음처럼 빌드-bebopc 실행 오류가 납니다.
1>Bebop Prepare For Build Diagnostic
1>Bebop Compiler Path = W:\dimohy\.nuget\packages\bebop-tools\3.0.4\tools\windows\x64\bebopc.exe
1>Bebop Output Directory = ./Models/
1>Bebop Output File = Models.g.cs
1>Bebop Target Language = cs
1>Bebop LangVersion = 9.0
1>Bebop Log Format = MSBuild
1>Bebop Namespace = BebopTest.Models
1>Input Schemas = "W:\Enjoy\BebopTest\models.bop"
1>Bebop Output = W:\Enjoy\BebopTest\Models\Models.g.cs
1>Incomplete generator token specified 'cs:W:\Enjoy\BebopTest\Models\Models.g.cs,namespace=BebopTest.Models,langVersion=9.0'.
1>
1>W:\dimohy\.nuget\packages\bebop-tools\3.0.4\build\bebop-tools.targets(66,9): error MSB3073: "..." 명령이 종료되었습니다(코드: 1).
아… generator (bebopc의 --generator 인자 값) 의 토큰이 윈도 드라이버의 ':'랑 충돌하는 듯 해 보입니다;
cs:W:
의 ‘:’
관련해서 버그 신고를 했고
사용 못해보는 것이 아쉬워서 상대경로로 윈도 드라이버 문자를 제거한 후 bebopc
의 watch
기능을 이용해 동작성을 확인했습니다.
W:\Enjoy\BebopTest>"W:\dimohy\.nuget\packages\bebop-tools\3.0.4\tools\windows\x64\bebopc.exe" --include "models.bop" watch --generator "cs:Models\Models.g.cs,namespace=BebopTest.Models,langVersion=9.0"
Watching
┌──────────────────────┬────────────────────┐
│ Status │ Path │
├──────────────────────┼────────────────────┤
│ Watching │ W:/Enjoy/BebopTest │
│ │ │
│ Excluded Directories │ │
│ │ │
│ Excluded Files │ │
└──────────────────────┴────────────────────┘
이제 Models.bop
파일을 갱신할 때마다 bebopc watch
동작에 의해서 Models/Models.g.cs
파일이 생기는 것을 확인 했고
| Models/Models.g.cs
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
//
// bebopc version:
// 3.0.4
//
//
// bebopc source:
// https://github.com/betwixt-labs/bebop
//
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//
// This source code was auto-generated by bebopc, Version=3.0.4.
//
namespace BebopTest.Models {
[global::System.CodeDom.Compiler.GeneratedCode("bebopc", "3.0.4")]
[global::Bebop.Attributes.BebopRecord(global::Bebop.Runtime.BebopKind.Struct)]
public partial class Hello : global::Bebop.Runtime.BaseBebopRecord, global::System.IEquatable<Hello> {
...
다음의 코드를 통해 잘 동작함을 확인하였습니다.
| Program.cs
using BebopTest.Models;
var source = new Hello(5, 10);
var data = source.Encode();
var target = Hello.Decode(data);
Console.WriteLine($"X:{target.X}, Y:{target.Y}");
| 출력
X:5, Y:10
얼마나 빠른지 궁금해서 간단히 다음 코드로 인코딩 및 디코딩을 천만번 반복했는데
using System.Diagnostics;
using BebopTest.Models;
var sw = Stopwatch.StartNew();
for (var i = 0; i < 10000000; i++)
{
var source = new Hello(5, 10);
var data = source.Encode();
var target = Hello.Decode(data);
if (i % 100000 == 0)
Console.WriteLine($"{i}: X:{target.X}, Y:{target.Y}");
}
sw.Stop();
Console.WriteLine($"{sw.ElapsedMilliseconds} ms");
183 ms 가 나오네요. 빠릅니다!
13개의 좋아요
해당 문제가 수정되어 3.0.5
에 해결되었다고 합니다. 빠르네요!
7개의 좋아요
크으 컨트리뷰터다…
2개의 좋아요