Git Product home page Git Product logo

Comments (4)

yugui avatar yugui commented on May 22, 2024

@achew22 No, I don't have a good example since I am just trying Bazel in a small project which does not use grpc-gateway.
But I agree that it would be useful if we have a Skylark macro like grpc_gateway_library or grpc_gateway_binary

from grpc-gateway.

ivucica avatar ivucica commented on May 22, 2024

The following is from a project that's not opensourced (yet), so I can't point to the exact rules. One limiting factor is that I also have custom Go rules (based on Kythe's rules) and haven't gotten around to reworking Bazel's Go rules (see bazelbuild/bazel#828). Because the build rule for //vendor:protoc-gen-gprc-gateway is too dependent on custom Go rules that are too fragile and messy to be shared, I'm not sharing them here.

Instead I'll try to describe my approach enough to get interested people started.

This is my genrule() in the BUILD file for the Bazel package containing file scheduler.proto:

genrule(
    name = "scheduler_pb_gw",
    srcs = [
        "scheduler.proto",
        "//vendor:github.com/gengo/grpc-gateway/third_party/googleapis/google/api/annotations.proto",
        "//vendor:github.com/gengo/grpc-gateway/third_party/googleapis/google/api/http.proto",
        "//vendor:github.com/gogo/protobuf/protobuf/google/protobuf/descriptor.proto"],
    outs = ["scheduler.pb.gw.go"],
    cmd = (
        "$(location @protobuf//:protoc) " +
        " --grpc-gateway_out=logtostderr=true:$$(dirname $@)" +
        " -I$$(dirname $$(dirname $$(dirname $(location //vendor:github.com/gengo/grpc-gateway/third_party/googleapis/google/api/annotations.proto)))):$$(dirname $$(dirname $$(dirname $(location //vendor:github.com/gogo/protobuf/protobuf/google/protobuf/descriptor.proto)))):." +
        " --plugin=protoc-gen-grpc-gateway=$(location //vendor:protoc-gen-grpc-gateway)" +
        " --proto_path=$$(dirname $(location scheduler.proto)):$$(dirname \"$@\")" +
        " $(location scheduler.proto); mv \"$$(dirname \"$@\")\"/scheduler/\"$$(basename \"$@\")\" \"$@\""),
    message = "Processing proto file with grpc-gateway",
    tools = [
        "@protobuf//:protoc",
        "//vendor:protoc-gen-grpc-gateway",
    ]
)

The WORKSPACE defines external repository protobuf. While ordinarily one would specify a git_repository() rule, I am already using vendoring + externals:

local_repository(
    name = "protobuf",
    path = __workspace_dir__ + "/vendor/github.com/google/protobuf",
)

I'm using a genrule() here because it was easier than writing a proper Skylark rule. Even this genrule() is quite hacky.

from grpc-gateway.

yugui avatar yugui commented on May 22, 2024

@ivucica Thank you for sharing that.

Although I'm not going to write the skylark rule by myself very soon, but it is definitely on my to-do list.
Also I'm happy to accept PRs for the rule. In both cases, your genrule will be quite helpful.

from grpc-gateway.

pcj avatar pcj commented on May 22, 2024

I've posted a preliminary implementation of grpc_gateway_proto_library in rules_protobuf that:

  • builds the grpc-gateway runtime and associated libraries,
  • builds the protoc-gen-grpc-gateway plugin,
  • invokes the plugin
  • compiles the *.pb.gw.go files into a go_library

Hopefully we can accomplish easy grpc-gateway support in bazel. Feedback or contributions welcome.

from grpc-gateway.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.