{"id":13810784,"url":"https://github.com/bazelbuild/rules_appengine","last_synced_at":"2025-05-14T15:31:09.953Z","repository":{"id":48854318,"uuid":"53951781","full_name":"bazelbuild/rules_appengine","owner":"bazelbuild","description":"AppEngine rules for Bazel","archived":true,"fork":false,"pushed_at":"2023-10-11T14:21:26.000Z","size":148,"stargazers_count":30,"open_issues_count":26,"forks_count":51,"subscribers_count":30,"default_branch":"master","last_synced_at":"2024-11-19T05:55:33.776Z","etag":null,"topics":["appengine-sdk","bazel","bazel-rules"],"latest_commit_sha":null,"homepage":null,"language":"Starlark","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bazelbuild.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-03-15T14:35:20.000Z","updated_at":"2024-07-01T18:30:40.000Z","dependencies_parsed_at":"2024-01-18T02:37:01.819Z","dependency_job_id":"2cbe288b-aeb3-4ead-b0fe-210a829ce5a4","html_url":"https://github.com/bazelbuild/rules_appengine","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bazelbuild%2Frules_appengine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bazelbuild%2Frules_appengine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bazelbuild%2Frules_appengine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bazelbuild%2Frules_appengine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bazelbuild","download_url":"https://codeload.github.com/bazelbuild/rules_appengine/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254171712,"owners_count":22026499,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["appengine-sdk","bazel","bazel-rules"],"created_at":"2024-08-04T03:00:26.006Z","updated_at":"2025-05-14T15:31:04.942Z","avatar_url":"https://github.com/bazelbuild.png","language":"Starlark","readme":"🚨 rules_appengine is no longer maintained.\n\n\n[![Build status](https://badge.buildkite.com/98ffeea8dc7631a8a7d7af13cbe7570a7209a98ef18fe3cbc5.svg)](https://buildkite.com/bazel/appengine-rules-appengine-postsubmit)\n\n\n# App Engine Rules for Bazel\n\n\u003cdiv class=\"toc\"\u003e\n  \u003ch2\u003eRules\u003c/h2\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"#appengine_war\"\u003eappengine_war\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#java_war\"\u003ejava_war\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#py_appengine_binary\"\u003epy_appengine_binary\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#py_appengine_test\"\u003epy_appengine_test\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/div\u003e\n\n## Overview\n\nThese build rules are used for building\n[Java App Engine](https://cloud.google.com/appengine/docs/java/) application or\n[Python App Engine](https://cloud.google.com/appengine/docs/python/) application\nwith Bazel. It does not aim at general web application\nsupport but can be easily modified to handle a standard web application.\n\n\u003ca name=\"setup\"\u003e\u003c/a\u003e\n## Setup\n\nTo be able to use the rules, you must make the App Engine SDK available to\nBazel. The easiest way to do so is by adding the following to your\n`WORKSPACE` file:\n\nNote: The `${LANG}_appengine_repository()` lines are only needed for the languages you plan to use.\n\n```python\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nhttp_archive(\n    name = \"bazel_skylib\",\n    urls = [\n        \"https://github.com/bazelbuild/bazel-skylib/releases/download/1.0.3/bazel-skylib-1.0.3.tar.gz\",\n        \"https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.0.3/bazel-skylib-1.0.3.tar.gz\",\n    ],\n    sha256 = \"1c531376ac7e5a180e0237938a2536de0c54d93f5c278634818e0efc952dd56c\",\n)\nload(\"@bazel_skylib//:workspace.bzl\", \"bazel_skylib_workspace\")\nbazel_skylib_workspace()\n\ngit_repository(\n    name = \"io_bazel_rules_appengine\",\n    remote = \"https://github.com/bazelbuild/rules_appengine.git\",\n    # Check https://github.com/bazelbuild/rules_appengine/releases for the latest version.\n    tag = \"0.0.8\",\n)\n# Java\nload(\n    \"@io_bazel_rules_appengine//appengine:java_appengine.bzl\",\n    \"java_appengine_repositories\",\n)\n\njava_appengine_repositories()\n\n# Python\nload(\n    \"@io_bazel_rules_appengine//appengine:sdk.bzl\",\n    \"appengine_repositories\",\n)\n\nappengine_repositories()\n\nload(\n    \"@io_bazel_rules_appengine//appengine:py_appengine.bzl\",\n    \"py_appengine_repositories\",\n)\n\npy_appengine_repositories()\n```\n\nThe App Engine rules download the App Engine SDK, which is a few hundred\nmegabytes in size. To avoid downloading this multiple times for multiple\nprojects or inadvertently re-downloading it, you might want to add the\nfollowing lines to your `$HOME/.bazelrc` file:\n\n```\nbuild --experimental_repository_cache=/home/user/.bazel/cache\nfetch --experimental_repository_cache=/home/user/.bazel/cache\n```\n\n### Requesting a specific App Engine SDK\n\nAll ${LANG}_appengine_repository macros accept optional arguments `version`\nand `sha256`.\n\n```python\npy_appengine_repositories(\n    version = '1.9.67',\n    sha256 = 'f9f45150643424cb164185d9134b86511c2bec3001499247ef9027f1605ef8a3',\n)\n```\n\n### Using a predownloaded SDK version\n\nYou can, optionally, specify the environment variable\n`${LANG}_APPENGINE_SDK_PATH` to use an SDK that is unzipped on your filesystem\n(instead of downloading a new one).\n\n```\nPY_APPENGINE_SDK_PATH=/path/to/google_appengine bazel build //whatever\nJAVA_APPENGINE_SDK_PATH=/path/to/appengine-java-sdk-1.9.50 bazel build //whatever\n```\n\n\u003ca name=\"basic-example\"\u003e\u003c/a\u003e\n## Basic Java Example\n\nSuppose you have the following directory structure for a simple App Engine\napplication:\n\n```\n[workspace]/\n    WORKSPACE\n    hello_app/\n        BUILD\n        java/my/webapp/\n            TestServlet.java\n        webapp/\n            index.html\n        webapp/WEB-INF\n            web.xml\n            appengine-web.xml\n```\n\n### BUILD definition\n\nThen, to build your webapp, your `hello_app/BUILD` can look like:\n\n```python\nload(\"@io_bazel_rules_appengine//appengine:java_appengine.bzl\", \"appengine_war\")\n\njava_library(\n    name = \"mylib\",\n    srcs = [\"java/my/webapp/TestServlet.java\"],\n    deps = [\n        \"//external:appengine/java/api\",\n        \"@io_bazel_rules_appengine//appengine:javax.servlet.api\",\n    ],\n)\n\nappengine_war(\n    name = \"myapp\",\n    jars = [\":mylib\"],\n    data = glob([\"webapp/**\"]),\n    data_path = \"/webapp\",\n)\n```\n\nFor simplicity, you can use the `java_war` rule to build an app from source.\nYour `hello_app/BUILD` file would then look like:\n\n```python\nload(\"@io_bazel_rules_appengine//appengine:java_appengine.bzl\", \"java_war\")\n\njava_war(\n    name = \"myapp\",\n    srcs = [\"java/my/webapp/TestServlet.java\"],\n    data = glob([\"webapp/**\"]),\n    data_path = \"/webapp\",\n    deps = [\n        \"//external:appengine/java/api\",\n        \"@io_bazel_rules_appengine//appengine:javax.servlet.api\",\n    ],\n)\n```\n\nYou can then build the application with `bazel build //hello_app:myapp`.\n\n### Run on a local server\n\nYou can run it in a development server with `bazel run //hello_app:myapp`.\nThis will bind a test server on port 8080. If you wish to select another port,\nuse the `--port` option:\n\n```\nbazel run //hello_app:myapp -- --port=12345\n```\n\nYou can see other options with `-- --help` (the `--` tells Bazel to pass the\nrest of the arguments to the executable).\n\n### Deploy to Google App Engine\n\nAnother target `//hello_app:myapp.deploy` allows you to deploy your\napplication to App Engine. It takes an optional argument: the\n`APP_ID`. If not specified, it uses the default `APP_ID` provided in\nthe application. This target needs to open a browser to authenticate\nwith App Engine, then have you copy-paste a \"key\" from the browser in\nthe terminal. Since Bazel closes standard input, you can only input\nthis by building the target and then running:\n\n```\n$ bazel-bin/hello_app/myapp.deploy APP_ID\n```\n\nAfter the first launch, subsequent launch will be registered to\nApp Engine so you can just do a normal `bazel run\n//hello_app:myapp.deploy -- APP_ID` to deploy next versions of\nyour application.\n\n## Java specific details\n\n*Note:* App Engine uses Java 8 (or Java 7, but this runtime is deprecated). If you\nare using a more recent version of Java, you will get the following error message when\nyou try to deploy:\n\n```\njava.lang.IllegalArgumentException: Class file is Java 9 but max supported is Java 8\n```\n\nTo build with Java 8, use the toolchain bundled with these App Engine rules:\n\n```\n$ bazel build --extra_toolchains=@io_bazel_rules_appengine//appengine/jdk:jdk8_definition //my-project\n```\n\nTo avoid having to specify this toolchain during every build, you can add this\nto your project's `.bazelrc`.  Create a `.bazelrc` file in the root directory of\nyour project and add the line:\n\n```\nbuild --extra_toolchains=@io_bazel_rules_appengine//appengine/jdk:jdk8_definition\n```\n\nIn case you don't want to install JDK 8 on the machine running Bazel, you can\nimport remote JDK8 repositories by adding the following lines to your WORKSPACE\nfile:\n\n```python\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\n\nhttp_archive(\n    name = \"rules_java\",\n    sha256 = \"7c4bbe11e41c61212a5cf16d9aafaddade3f5b1b6c8bf94270d78215fafd4007\",\n    strip_prefix = \"rules_java-c13e3ead84afb95f81fbddfade2749d8ba7cb77f\",\n    url = \"https://github.com/bazelbuild/rules_java/archive/c13e3ead84afb95f81fbddfade2749d8ba7cb77f.tar.gz\",  # 2021-01-25\n)\n\nload(\"@rules_java//java:repositories.bzl\", \"remote_jdk8_repos\")\n\nremote_jdk8_repos()\n```\n\n\u003ca name=\"appengine_war\"\u003e\u003c/a\u003e\n## appengine_war\n\n```python\nappengine_war(name, jars, data, data_path)\n```\n\n\u003ctable class=\"table table-condensed table-bordered table-params\"\u003e\n  \u003ccolgroup\u003e\n    \u003ccol class=\"col-param\" /\u003e\n    \u003ccol class=\"param-description\" /\u003e\n  \u003c/colgroup\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth colspan=\"2\"\u003eAttributes\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003eName, required\u003c/code\u003e\n        \u003cp\u003eA unique name for this rule.\u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ejars\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003eList of labels, required\u003c/code\u003e\n        \u003cp\u003e\n          List of JAR files that will be uncompressed as the code for the\n          Web Application.\n        \u003c/p\u003e\n        \u003cp\u003e\n          If it is a `java_library` or a `java_import`, the\n          JAR from the runtime classpath will be added in the `lib` directory\n          of the Web Application.\n        \u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003edata\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003eList of files, optional\u003c/code\u003e\n        \u003cp\u003eList of files used by the Web Application at runtime.\u003c/p\u003e\n        \u003cp\u003e\n          This attribute can be used to specify the list of resources to\n          be included into the WAR file.\n        \u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003edata_path\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003eString, optional\u003c/code\u003e\n        \u003cp\u003eRoot path of the data.\u003c/p\u003e\n        \u003cp\u003e\n          The directory structure from the data is preserved inside the\n          WebApplication but a prefix path determined by `data_path`\n          is removed from the the directory structure. This path can\n          be absolute from the workspace root if starting with a `/` or\n          relative to the rule's directory. It is set to `.` by default.\n        \u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003ca name=\"java_war\"\u003e\u003c/a\u003e\n## java_war\n\n```python\njava_war(name, data, data_path, **kwargs)\n```\n\n\u003ctable class=\"table table-condensed table-bordered table-params\"\u003e\n  \u003ccolgroup\u003e\n    \u003ccol class=\"col-param\" /\u003e\n    \u003ccol class=\"param-description\" /\u003e\n  \u003c/colgroup\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth colspan=\"2\"\u003eAttributes\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003eName, required\u003c/code\u003e\n        \u003cp\u003eA unique name for this rule.\u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003edata\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003eList of labels, optional\u003c/code\u003e\n        \u003cp\u003eList of files used by the Web Application at runtime.\u003c/p\u003e\n        \u003cp\u003ePassed to the \u003ca href=\"#appengine_war\"\u003eappengine_war\u003c/a\u003e rule.\u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003edata_path\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003eString, optional\u003c/code\u003e\n        \u003cp\u003eRoot path of the data.\u003c/p\u003e\n        \u003cp\u003ePassed to the \u003ca href=\"#appengine_war\"\u003eappengine_war\u003c/a\u003e rule.\u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003e**kwargs\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003esee \u003ca href=\"http://bazel.io/docs/be/java.html#java_library\"\u003ejava_library\u003c/a\u003e\u003c/code\u003e\n        \u003cp\u003e\n          The other arguments of this rule will be passed to build a `java_library`\n          that will be passed in the `jar` arguments of a\n          \u003ca href=\"#appengine_war\"\u003eappengine_war\u003c/a\u003e rule.\n        \u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n## Python specific details\n\n\u003ca name=\"py_appengine_binary\"\u003e\u003c/a\u003e\n## py_appengine_binary\n```python\npy_appengine_binary(name, srcs, configs, deps=[], data=[], overwrite_appengine_config=True)\n```\n\u003ctable class=\"table table-condensed table-bordered table-params\"\u003e\n  \u003ccolgroup\u003e\n    \u003ccol class=\"col-param\" /\u003e\n    \u003ccol class=\"param-description\" /\u003e\n  \u003c/colgroup\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth colspan=\"2\"\u003eAttributes\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003eName, required\u003c/code\u003e\n        \u003cp\u003eA unique name for this rule.\u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003econfigs\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003eList of labels, required\u003c/code\u003e\n        \u003cp\u003ethe path to your app.yaml/index.yaml/cron.yaml files\u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003esrcs\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003eList of labels, optional\u003c/code\u003e\n        \u003cp\u003eThe list of source files that are processed to create the target. \u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003edeps\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003eList of labels, optional\u003c/code\u003e\n        \u003cp\u003eThe list of libraries to link into this library. \u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003edata\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003eList of labels, optional\u003c/code\u003e\n        \u003cp\u003eList of files used by the Web Application at runtime.\u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eoverwrite_appengine_config\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003eBoolean, optional\u003c/code\u003e\n        \u003cp\u003eIf true, patch the user's appengine_config into the base one. If false, use\n           the user specified config directly. Set to False to behave pre 0.0.8.\u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e    \n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003ca name=\"py_appengine_test\"\u003e\u003c/a\u003e\n## py_appengine_test\n```python\npy_appengine_test(name, srcs, deps=[], data=[], libraries={})\n```\n\u003ctable class=\"table table-condensed table-bordered table-params\"\u003e\n  \u003ccolgroup\u003e\n    \u003ccol class=\"col-param\" /\u003e\n    \u003ccol class=\"param-description\" /\u003e\n  \u003c/colgroup\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth colspan=\"2\"\u003eAttributes\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003eName, required\u003c/code\u003e\n        \u003cp\u003eA unique name for this rule.\u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003esrcs\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003eList of labels, required\u003c/code\u003e\n        \u003cp\u003eThe list of source files that are processed to create the target. \u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003edeps\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003eList of labels, optional\u003c/code\u003e\n        \u003cp\u003eThe list of libraries to link into this library. \u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003edata\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003eList of labels, optional\u003c/code\u003e\n        \u003cp\u003eList of files used by the Web Application at runtime.\u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003elibraries\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ccode\u003edict, optional\u003c/code\u003e\n        \u003cp\u003edictionary of name and the corresponding version for third-party libraries required from sdk.\u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n","funding_links":[],"categories":["Deployment"],"sub_categories":["Google projects"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbazelbuild%2Frules_appengine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbazelbuild%2Frules_appengine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbazelbuild%2Frules_appengine/lists"}