When I first started writing custom Bazel rules, I often created
separate rules for the build and run commands in Bazel.
For example, I once wrote rules that looked something like:
srcs = ["..."],
My expectation that users would bazel build //:my_app and
bazel run //:run_app.
This separation is silly and unnecessary. A Bazel rule can support
both build and run at the same time. All you have to do is declare
the rule as executable and have it return a DefaultInfo() object with
both an executable and a files attribute.
For example, here is an example of a extremely simplistic cc_binary()