Build Unity protos as a Bazel DLL (#7291)

This commit is contained in:
2026-06-16 07:54:23 -07:00
committed by GitHub
parent b2f22bbeb1
commit 0f2cabd469
11 changed files with 73 additions and 53 deletions
+12
View File
@@ -104,6 +104,12 @@ jobs:
- name: Clean stale files - name: Clean stale files
run: | run: |
git clean -ffd git clean -ffd
UNITY_ROOT="src/main/csharp/net/eagle0/clients/unity/eagle0"
# These ignored proto outputs are mutually exclusive across proto-generation
# layouts. Clean both before regenerating to avoid stale DLL/source duplicates
# when a self-hosted runner switches between main and PR branches.
rm -rf "$UNITY_ROOT/Assets/GeneratedProtos"
rm -rf "$UNITY_ROOT/Assets/Plugins/Eagle0Protos"
LIBRARY_DIR="src/main/csharp/net/eagle0/clients/unity/eagle0/Library" LIBRARY_DIR="src/main/csharp/net/eagle0/clients/unity/eagle0/Library"
VERSION_CACHE="$LIBRARY_DIR/.last_unity_version" VERSION_CACHE="$LIBRARY_DIR/.last_unity_version"
PROJECT_VERSION_FILE="src/main/csharp/net/eagle0/clients/unity/eagle0/ProjectSettings/ProjectVersion.txt" PROJECT_VERSION_FILE="src/main/csharp/net/eagle0/clients/unity/eagle0/ProjectSettings/ProjectVersion.txt"
@@ -213,6 +219,12 @@ jobs:
- name: Clean stale files - name: Clean stale files
run: | run: |
git clean -ffd git clean -ffd
UNITY_ROOT="src/main/csharp/net/eagle0/clients/unity/eagle0"
# These ignored proto outputs are mutually exclusive across proto-generation
# layouts. Clean both before regenerating to avoid stale DLL/source duplicates
# when a self-hosted runner switches between main and PR branches.
rm -rf "$UNITY_ROOT/Assets/GeneratedProtos"
rm -rf "$UNITY_ROOT/Assets/Plugins/Eagle0Protos"
LIBRARY_DIR="src/main/csharp/net/eagle0/clients/unity/eagle0/Library" LIBRARY_DIR="src/main/csharp/net/eagle0/clients/unity/eagle0/Library"
VERSION_CACHE="$LIBRARY_DIR/.last_unity_version" VERSION_CACHE="$LIBRARY_DIR/.last_unity_version"
PROJECT_VERSION_FILE="src/main/csharp/net/eagle0/clients/unity/eagle0/ProjectSettings/ProjectVersion.txt" PROJECT_VERSION_FILE="src/main/csharp/net/eagle0/clients/unity/eagle0/ProjectSettings/ProjectVersion.txt"
+15 -53
View File
@@ -1,68 +1,30 @@
#!/bin/bash #!/bin/bash
set -euxo pipefail set -euo pipefail
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
UNITY_ROOT="$REPO_ROOT/src/main/csharp/net/eagle0/clients/unity/eagle0" UNITY_ROOT="$REPO_ROOT/src/main/csharp/net/eagle0/clients/unity/eagle0"
OUTPUT_DIR="$UNITY_ROOT/Assets/GeneratedProtos" PLUGIN_DIR="$UNITY_ROOT/Assets/Plugins/Eagle0Protos"
GENERATED_SOURCES_DIR="$UNITY_ROOT/Assets/GeneratedProtos"
PROTO_DLL_TARGET="//src/main/csharp/net/eagle0/clients/unity/eagle0:eagle0_protos"
PROTO_DLL_OUTPUT="$REPO_ROOT/bazel-bin/src/main/csharp/net/eagle0/clients/unity/eagle0/eagle0_protos/netstandard2.1"
# All C# protobuf generation targets /bin/echo "Building C# protobuf DLL..."
TARGETS=( bazel build "$PROTO_DLL_TARGET"
"//src/main/protobuf/net/eagle0/common:common_csharp_proto_srcs"
"//src/main/protobuf/net/eagle0/shardok/storage:storage_csharp_proto_srcs"
"//src/main/protobuf/net/eagle0/shardok/common:common_csharp_proto_srcs"
"//src/main/protobuf/net/eagle0/shardok/api:api_csharp_proto_srcs"
"//src/main/protobuf/net/eagle0/eagle/common:common_csharp_proto_srcs"
"//src/main/protobuf/net/eagle0/eagle/views:views_csharp_proto_srcs"
"//src/main/protobuf/net/eagle0/eagle/api:api_csharp_proto_srcs"
"//src/main/protobuf/net/eagle0/eagle/api:api_csharp_grpc_srcs"
"//src/main/protobuf/net/eagle0/eagle/api/command/util:util_csharp_proto_srcs"
)
# Subdirectory for each target (avoids filename collisions across packages) /bin/echo "Syncing generated protobuf DLL to $PLUGIN_DIR..."
SUBDIRS=(
"net/eagle0/common"
"net/eagle0/shardok/storage"
"net/eagle0/shardok/common"
"net/eagle0/shardok/api"
"net/eagle0/eagle/common"
"net/eagle0/eagle/views"
"net/eagle0/eagle/api"
"net/eagle0/eagle/api"
"net/eagle0/eagle/api/command/util"
)
/bin/echo "Building C# protobuf sources..."
bazel build "${TARGETS[@]}"
/bin/echo "Syncing generated .cs files to $OUTPUT_DIR..."
# Stage new files in a temp directory, then rsync to preserve timestamps
# on unchanged files. This avoids triggering Unity reimport when protos
# haven't changed, saving ~7 minutes of script recompilation.
STAGING_DIR=$(mktemp -d) STAGING_DIR=$(mktemp -d)
trap "rm -rf '$STAGING_DIR'" EXIT trap "rm -rf '$STAGING_DIR'" EXIT
for i in "${!TARGETS[@]}"; do cp "$PROTO_DLL_OUTPUT/Eagle0Protos.dll" "$STAGING_DIR/"
target="${TARGETS[$i]}" cp "$PROTO_DLL_OUTPUT/Eagle0Protos.xml" "$STAGING_DIR/"
subdir="${SUBDIRS[$i]}"
# Convert target label to bazel-bin path
# //src/main/protobuf/net/eagle0/common:common_csharp_proto_srcs
# -> bazel-bin/src/main/protobuf/net/eagle0/common/common_csharp_proto_srcs
target_path="${target#//}"
pkg="${target_path%%:*}"
name="${target_path##*:}"
bin_dir="$REPO_ROOT/bazel-bin/$pkg/$name"
dest_dir="$STAGING_DIR/$subdir"
mkdir -p "$dest_dir"
find "$bin_dir" -name "*.cs" -exec cp {} "$dest_dir/" \;
done
# Sync only changed files and delete removed ones; --checksum compares # Sync only changed files and delete removed ones; --checksum compares
# content not timestamps so unchanged files keep their original mtime. # content not timestamps so unchanged files keep their original mtime.
mkdir -p "$OUTPUT_DIR" mkdir -p "$PLUGIN_DIR"
rsync -rc --delete "$STAGING_DIR/" "$OUTPUT_DIR/" rsync -rc --delete --exclude "*.meta" "$STAGING_DIR/" "$PLUGIN_DIR/"
/bin/echo "Done. Generated C# proto sources in $OUTPUT_DIR" rm -rf "$GENERATED_SOURCES_DIR"
/bin/echo "Done. Generated C# proto DLL in $PLUGIN_DIR"
@@ -1,3 +1,5 @@
load("@rules_dotnet//dotnet:defs.bzl", "csharp_library", "import_dll")
#unity3d_binary( #unity3d_binary(
# name = "windows", # name = "windows",
# build_command = "buildWindows64Player", # build_command = "buildWindows64Player",
@@ -13,3 +15,38 @@ genrule(
outs = ["eagle0.exe"], outs = ["eagle0.exe"],
cmd = "", cmd = "",
) )
# Compile against Unity's vendored package DLLs so the Bazel-built proto
# assembly references the same runtime assemblies Unity imports.
import_dll(
name = "google_protobuf_dll",
dll = "Assets/Packages/Google.Protobuf.3.27.3/lib/netstandard2.0/Google.Protobuf.dll",
version = "3.27.3",
)
import_dll(
name = "grpc_core_api_dll",
dll = "Assets/Packages/Grpc.Core.Api.2.65.0/lib/netstandard2.1/Grpc.Core.Api.dll",
version = "2.65.0",
)
csharp_library(
name = "eagle0_protos",
srcs = [
"//src/main/protobuf/net/eagle0/common:common_csharp_proto_srcs",
"//src/main/protobuf/net/eagle0/eagle/api:api_csharp_grpc_srcs",
"//src/main/protobuf/net/eagle0/eagle/api:api_csharp_proto_srcs",
"//src/main/protobuf/net/eagle0/eagle/api/command/util:util_csharp_proto_srcs",
"//src/main/protobuf/net/eagle0/eagle/common:common_csharp_proto_srcs",
"//src/main/protobuf/net/eagle0/eagle/views:views_csharp_proto_srcs",
"//src/main/protobuf/net/eagle0/shardok/api:api_csharp_proto_srcs",
"//src/main/protobuf/net/eagle0/shardok/common:common_csharp_proto_srcs",
"//src/main/protobuf/net/eagle0/shardok/storage:storage_csharp_proto_srcs",
],
out = "Eagle0Protos",
target_frameworks = ["netstandard2.1"],
deps = [
":google_protobuf_dll",
":grpc_core_api_dll",
],
)
@@ -227,6 +227,7 @@ csharp_proto_compile(
":tutorial_battle_config_proto", ":tutorial_battle_config_proto",
":victory_condition_proto", ":victory_condition_proto",
], ],
visibility = ["//src/main/csharp/net/eagle0/clients/unity/eagle0:__pkg__"],
) )
# keep: gazelle wants go_grpc_v2 and shardok_internal_interface_proto, but that breaks Go compilation # keep: gazelle wants go_grpc_v2 and shardok_internal_interface_proto, but that breaks Go compilation
@@ -168,6 +168,7 @@ csharp_proto_compile(
":selected_command_proto", ":selected_command_proto",
":streaming_text_response_proto", ":streaming_text_response_proto",
], ],
visibility = ["//src/main/csharp/net/eagle0/clients/unity/eagle0:__pkg__"],
) )
csharp_grpc_compile( csharp_grpc_compile(
@@ -176,6 +177,7 @@ csharp_grpc_compile(
":auth_grpc", ":auth_grpc",
":eagle_grpc", ":eagle_grpc",
], ],
visibility = ["//src/main/csharp/net/eagle0/clients/unity/eagle0:__pkg__"],
) )
# Non-gRPC message protos # Non-gRPC message protos
@@ -280,6 +280,7 @@ csharp_proto_compile(
":prisoner_management_type_proto", ":prisoner_management_type_proto",
":province_orders_proto", ":province_orders_proto",
], ],
visibility = ["//src/main/csharp/net/eagle0/clients/unity/eagle0:__pkg__"],
) )
go_proto_library( go_proto_library(
@@ -409,6 +409,7 @@ csharp_proto_compile(
":unaffiliated_hero_quest_proto", ":unaffiliated_hero_quest_proto",
":unaffiliated_hero_type_proto", ":unaffiliated_hero_type_proto",
], ],
visibility = ["//src/main/csharp/net/eagle0/clients/unity/eagle0:__pkg__"],
) )
go_proto_library( go_proto_library(
@@ -269,6 +269,7 @@ csharp_proto_compile(
":shardok_battle_view_proto", ":shardok_battle_view_proto",
":stat_with_condition_proto", ":stat_with_condition_proto",
], ],
visibility = ["//src/main/csharp/net/eagle0/clients/unity/eagle0:__pkg__"],
) )
go_proto_library( go_proto_library(
@@ -156,6 +156,7 @@ csharp_proto_compile(
":roll_request_proto", ":roll_request_proto",
":unit_view_proto", ":unit_view_proto",
], ],
visibility = ["//src/main/csharp/net/eagle0/clients/unity/eagle0:__pkg__"],
) )
go_proto_library( go_proto_library(
@@ -223,6 +223,7 @@ csharp_proto_compile(
":victory_condition_proto", ":victory_condition_proto",
":weather_proto", ":weather_proto",
], ],
visibility = ["//src/main/csharp/net/eagle0/clients/unity/eagle0:__pkg__"],
) )
go_proto_library( go_proto_library(
@@ -69,6 +69,7 @@ csharp_proto_compile(
":action_with_resulting_state_proto", ":action_with_resulting_state_proto",
":odds_proto", ":odds_proto",
], ],
visibility = ["//src/main/csharp/net/eagle0/clients/unity/eagle0:__pkg__"],
) )
go_proto_library( go_proto_library(