Git Product home page Git Product logo

bazelisk's Introduction

Bazelisk

A user-friendly launcher for Bazel.

About Bazelisk

Bazelisk is a wrapper for Bazel written in Go. It automatically picks a good version of Bazel given your current working directory, downloads it from the official server (if required) and then transparently passes through all command-line arguments to the real Bazel binary. You can call it just like you would call Bazel.

Installation

On macOS: brew install bazelisk.

On Windows: choco install bazelisk.

Each adds bazelisk to the PATH as both bazelisk and bazel.

On Linux: You can download Bazelisk binary on our Releases page and add it to your PATH manually, which also works on macOS and Windows.

Bazelisk is also published to npm. Frontend developers may want to install it with npm install -g @bazel/bazelisk.

You will notice that it serves an analogous function for Bazel as the nvm utility which manages your version of Node.js.

Some ideas how to use it:

  • Install it as the bazel binary in your PATH (e.g. copy it to /usr/local/bin/bazel). Never worry about upgrading Bazel to the latest version again.
  • Check it into your repository and recommend users to build your software via ./bazelisk build //my:software. That way, even someone who has never used Bazel or doesn't have it installed can build your software.
  • As a company using Bazel or as a project owner, add a .bazelversion file to your repository. This will tell Bazelisk to use the exact version specified in the file when running in your workspace. The fact that it's versioned inside your repository will then allow for atomic upgrades of Bazel including all necessary changes. If you install Bazelisk as bazel on your CI machines, too, you can even test Bazel upgrades via a normal presubmit / pull request. It will also ensure that users will not try to build your project with an incompatible version of Bazel, which is often a cause for frustration and failing builds. (But see the note below about ensuring your developers install Bazelisk.)

Before Bazelisk was rewritten in Go, it was a Python script. This still works and has the advantage that you can run it on any platform that has a Python interpreter, but is currently unmaintained and it doesn't support as many features. The documentation below describes the newer Go version only.

How does Bazelisk know which Bazel version to run?

It uses a simple algorithm:

  • If the environment variable USE_BAZEL_VERSION is set, it will use the version specified in the value.
  • Otherwise, if a .bazeliskrc file exists in the workspace root and contains the USE_BAZEL_VERSION variable, this version will be used.
  • Otherwise, if a .bazelversion file exists in the current directory or recursively any parent directory, it will read the file and use the version specified in it.
  • Otherwise, if the environment variable USE_BAZEL_FALLBACK_VERSION is set to one of the following formats:
    • If set to a value starting with error:, it will report an error and version detection will fail.
    • If set to a value starting with warn:, it will report a warning and use the version specified after the prefix.
    • If set to a value starting with silent:, it will use the version specified after the prefix.
  • Otherwise, it will use the official latest Bazel release.

A version can optionally be prefixed with a fork name. The fork and version should be separated by slash: <FORK>/<VERSION>. Please see the next section for how to work with forks.

Bazelisk currently understands the following formats for version labels:

  • latest means the latest stable (LTS) version of Bazel as released on GitHub. Previous releases can be specified via latest-1, latest-2 etc.
  • A version number like 0.17.2 means that exact version of Bazel. It can also be a release candidate version like 0.20.0rc3, or a rolling release version like 5.0.0-pre.20210317.1.
  • A floating version identifier like 4.x that returns the latest release from the LTS series started by Bazel 4.0.0.
  • The hash of a Git commit. Please note that Bazel binaries are only available for commits that passed Bazel CI.

Additionally, a few special version names are supported for our official releases only (these formats do not work when using a fork):

  • last_green refers to the Bazel binary that was built at the most recent commit that passed Bazel CI. Ideally this binary should be very close to Bazel-at-head.
  • last_downstream_green points to the most recent Bazel binary that builds and tests all downstream projects successfully.
  • last_rc points to the most recent release candidate. If there is no active release candidate, Bazelisk uses the latest Bazel release instead.
  • rolling refers to the latest rolling release (even if there is a newer LTS release).

Where does Bazelisk get Bazel from?

By default Bazelisk retrieves Bazel releases, release candidates and binaries built at green commits from Google Cloud Storage. The downloaded artifacts are validated against the SHA256 value recorded in BAZELISK_VERIFY_SHA256 if this variable is set in the configuration file.

As mentioned in the previous section, the <FORK>/<VERSION> version format allows you to use your own Bazel fork hosted on GitHub:

If you want to create a fork with your own releases, you should follow the naming conventions that we use in bazelbuild/bazel for the binary file names as this results in predictable URLs that are similar to the official ones. The URL format looks like https://github.com/<FORK>/bazel/releases/download/<VERSION>/<FILENAME>.

You can also override the URL by setting the environment variable $BAZELISK_BASE_URL. Bazelisk will then append /<VERSION>/<FILENAME> to the base URL instead of using the official release server. Bazelisk will read file ~/.netrc for credentials for Basic authentication.

If for any reason none of this works, you can also override the URL format altogether by setting the environment variable $BAZELISK_FORMAT_URL. This variable takes a format-like string with placeholders and performs the following replacements to compute the download URL:

  • %e: Extension suffix, such as the empty string or .exe.
  • %h: Value of BAZELISK_VERIFY_SHA256, respecting uppercase/lowercase characters.
  • %m: Machine architecture name, such as arm64 or x86_64.
  • %o: Operating system name, such as darwin or linux.
  • %v: Bazel version as determined by Bazelisk.
  • %%: Literal % for escaping purposes.
  • All other characters after % are reserved for future use and result in a processing error.

Ensuring that your developers use Bazelisk rather than Bazel

Bazel installers typically provide Bazel's shell wrapper script as the bazel on the PATH.

When installed this way, Bazel checks the .bazelversion file itself, but the failure when it mismatches with the actual version of Bazel can be quite confusing to developers. You may find yourself having to explain the difference between Bazel and Bazelisk (especially when you upgrade the pinned version). To avoid this, you can add a check in your tools/bazel wrapper. Since Bazelisk is careful to avoid calling itself in a loop, it always calls the wrapper with the environment variable BAZELISK_SKIP_WRAPPER set to `true'. You can check for the presence of that variable, and when not found, report a useful error to your users about how to install Bazelisk.

Note that if users directly downloaded a Bazel binary and put it in their PATH, rather than running an installer, then tools/bazel and .bazelversion are not checked. You could call the versions.check starlark module from the beginning of your WORKSPACE to require users update their bazel.

Other features

The Go version of Bazelisk offers three new flags.

--strict

--strict expands to the set of incompatible flags which may be enabled for the given version of Bazel.

bazelisk --strict build //...

--migrate

--migrate will run Bazel multiple times to help you identify compatibility issues. If the code fails with --strict, the flag --migrate will run Bazel with each one of the flag separately, and print a report at the end. This will show you which flags can safely enabled, and which flags require a migration.

--bisect

--bisect flag allows you to bisect Bazel versions to find which version introduced a build failure. You can specify the range of versions to bisect with --bisect=<GOOD>..<BAD>, where GOOD is the last known working Bazel version and BAD is the first known non-working Bazel version. Bazelisk uses GitHub's compare API to get the list of commits to bisect. When GOOD is not an ancestor of BAD, GOOD is reset to their merge base commit.

Examples:

# Bisect between 6.0.0 and Bazel at HEAD
bazelisk --bisect=6.0.0..HEAD test //foo:bar_test

# Bisect between 6.1.0 and the second release candidate of Bazel 6.2.0
bazelisk --bisect=6.1.0..release-6.2.0rc2 test //foo:bar_test

# Bisect between two commits on the main branch (or branches with `release-` prefix) of the Bazel GitHub repository.
bazelisk --bisect=<good commit hash>..<bad commit hash> test //foo:bar_test

Note that, Bazelisk uses prebuilt Bazel binaries at commits on the main and release branches, therefore you cannot bisect your local commits.

Useful environment variables for --migrate and --bisect

You can set BAZELISK_INCOMPATIBLE_FLAGS to set a list of incompatible flags (separated by ,) to be tested, otherwise Bazelisk tests all flags starting with --incompatible_.

You can set BAZELISK_GITHUB_TOKEN to set a GitHub access token to use for API requests to avoid rate limiting when on shared networks.

You can set BAZELISK_SHUTDOWN to run shutdown between builds when migrating or bisecting if you suspect this affects your results.

You can set BAZELISK_CLEAN to run clean --expunge between builds when migrating or bisecting if you suspect this affects your results.

tools/bazel

If tools/bazel exists in your workspace root and is executable, Bazelisk will run this file, instead of the Bazel version it downloaded. It will set the environment variable BAZEL_REAL to the path of the downloaded Bazel binary. This can be useful, if you have a wrapper script that e.g. ensures that environment variables are set to known good values. This behavior can be disabled by setting the environment variable BAZELISK_SKIP_WRAPPER to any value (except the empty string) before launching Bazelisk.

You can control the user agent that Bazelisk sends in all HTTP requests by setting BAZELISK_USER_AGENT to the desired value.

.bazeliskrc configuration file

The Go version supports a .bazeliskrc file in the root directory of a workspace and the user home directory. This file allows users to set environment variables persistently.

Example file content:

USE_BAZEL_VERSION=0.19.0
BAZELISK_GITHUB_TOKEN=abc

The following variables can be set:

  • BAZELISK_BASE_URL
  • BAZELISK_CLEAN
  • BAZELISK_GITHUB_TOKEN
  • BAZELISK_HOME
  • BAZELISK_INCOMPATIBLE_FLAGS
  • BAZELISK_SHOW_PROGRESS
  • BAZELISK_SHUTDOWN
  • BAZELISK_SKIP_WRAPPER
  • BAZELISK_USER_AGENT
  • BAZELISK_VERIFY_SHA256
  • USE_BAZEL_VERSION

Configuration variables are evaluated with precedence order. The preferred values are derived in order from highest to lowest precedence as follows:

  • Variables defined in the environment
  • Variables defined in the workspace root .bazeliskrc
  • Variables defined in the user home .bazeliskrc

Requirements

For ease of use, the Python version of Bazelisk is written to work with Python 2.7 and 3.x and only uses modules provided by the standard library.

The Go version can be compiled to run natively on Linux, macOS and Windows. You need at least Go 1.11 to build Bazelisk, otherwise you'll run into errors like undefined: os.UserCacheDir.

To install the Go version, type:

go get github.com/bazelbuild/bazelisk

With Go 1.17 or later, the recommended way to install it is:

go install github.com/bazelbuild/bazelisk@latest

To add it to your PATH:

export PATH=$PATH:$(go env GOPATH)/bin

For more information, you may read about the GOPATH environment variable.

Ideas for the future

  • Add support for checked-in Bazel binaries.
  • When the version label is set to a commit hash, first download a matching binary version of Bazel, then build Bazel automatically at that commit and use the resulting binary.
  • Add support to automatically bisect a build failure to a culprit commit in Bazel. If you notice that you could successfully build your project using version X, but not using version X+1, then Bazelisk should be able to figure out the commit that caused the breakage and the Bazel team can easily fix the problem.

FAQ

Where does Bazelisk store the downloaded versions of Bazel?

It creates a directory called "bazelisk" inside your user cache directory and will store them there. Feel free to delete this directory at any time, as it can be regenerated automatically when required.

bazelisk's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bazelisk's Issues

404 on last_green

As part of our continuous integration tests, we used to build Bazel from HEAD in order to catch upcoming incompatible_... flag flips that impact us. Once we found Bazelisk, we changed the test to use it w/ USE_BAZEL_VERSION=last_green. However, we are sometimes seeing bazelisk get 404s when downloading Bazel.

Example from today:

2019/06/17 15:03:58 Using unreleased version at commit c84f7d39220c88dc44e9725df68805039917d8ed
2019/06/17 15:03:58 Downloading https://storage.googleapis.com/bazel-builds/artifacts/ubuntu1404/c84f7d39220c88dc44e9725df68805039917d8ed/bazel...
2019/06/17 15:03:58 could not download Bazel: HTTP GET https://storage.googleapis.com/bazel-builds/artifacts/ubuntu1404/c84f7d39220c88dc44e9725df68805039917d8ed/bazel failed with error 404

I see that the timing lines up such that a new green commit was created at around this time (times above are UTC), and c84f7d39220c88dc44e9725df68805039917d8ed may have just become not the "last green" commit as the test was running (and since Bazelisk caches for an hour, subsequent calls to bazelisk kept trying to pull down the build for this commit).

How long are "last green" builds kept available after a new green commit is added? Could this be what caused the issue for us?

bazel versions shown for when flags are flipping are wrong

bazelisk --migrate is now showing bazel version and github issue which is great. I love that this got added!

I think the bazel versions it shows are wrong though. Where are they grabbed from? Is it just because the tags are wrong in github?

On my codebase, if I run bazelisk --migrate with .bazelversion set to 1.2.0, I get this:

+++ Result
Command was successful with the following flags:
  --incompatible_disable_depset_items (Bazel 1.2: https://github.com/bazelbuild/bazel/issues/9017)
  --incompatible_disable_native_android_rules (Bazel 1.2: https://github.com/bazelbuild/bazel/issues/8391)
  --incompatible_disable_target_provider_fields (Bazel 1.2: https://github.com/bazelbuild/bazel/issues/9014)
  --incompatible_disallow_dict_lookup_unhashable_keys (Bazel 1.2: https://github.com/bazelbuild/bazel/issues/9184)
  --incompatible_enable_cc_toolchain_resolution (Bazel 1.2: https://github.com/bazelbuild/bazel/issues/7260)
  --incompatible_load_cc_rules_from_bzl (Bazel 1.2: https://github.com/bazelbuild/bazel/issues/8743)
  --incompatible_load_proto_rules_from_bzl (Bazel 1.2: https://github.com/bazelbuild/bazel/issues/8922)
  --incompatible_prohibit_aapt1 (Bazel 1.2: https://github.com/bazelbuild/bazel/issues/10000)
  --incompatible_remap_main_repo (Bazel 1.2: https://github.com/bazelbuild/bazel/issues/7130)
  --incompatible_remove_native_maven_jar (Bazel 1.2: https://github.com/bazelbuild/bazel/issues/6799)
  --incompatible_run_shell_command_string (Bazel 1.2: https://github.com/bazelbuild/bazel/issues/5903)
Migration is needed for the following flags:
  --incompatible_disallow_empty_glob (Bazel 1.2: https://github.com/bazelbuild/bazel/issues/8195)
  --incompatible_load_java_rules_from_bzl (Bazel 1.2: https://github.com/bazelbuild/bazel/issues/8746)
  --incompatible_load_python_rules_from_bzl (Bazel 1.2: https://github.com/bazelbuild/bazel/issues/9006)
  --incompatible_no_implicit_file_export (Bazel 1.2: https://github.com/bazelbuild/bazel/issues/10225)
  --incompatible_restrict_string_escapes (Bazel 1.2: https://github.com/bazelbuild/bazel/issues/8380)
  --incompatible_use_platforms_repo_for_constraints (Bazel 1.2: https://github.com/bazelbuild/bazel/issues/8622)

Looking at one of the issues from the failed flags:

https://github.com/bazelbuild/bazel/issues/8195)
  --incompatible_load_java_rules_from_bzl (Bazel 1.2: 

Here are the tags in github:
image

It looks like it is currently set to be a breaking change when upgrading to 3.0.0 so I would ideally like to see (Bazel 3.0.0) listed as the bazel version. Instead it says Bazel 1.2, which was actually the CURRENT version of bazel so that doesnt even make sense right?. Every single flag was listed as 1.2 as well.

Support bash autocomplete

Since bazelisk downloads entire binaries, autocomplete scripts are not accessible. bazelisk could potentially also download the autocomplete scripts to a predetermined location to make it easier invoke.

Bazelisk is missing some incompatible flags

There's a mismatch with the CI: https://buildkite.com/bazel/bazelisk-plus-incompatible-flags/builds/37#6dc0f493-7763-47c2-9ff0-5d9ba95e86e5

For example, notice that the CI lists incompatible_no_transitive_loads in the list of flags, but Bazelisk doesn't use it when calling Bazel.

The list of flags we use come from: https://api.github.com/search/issues?q=repo:bazelbuild/bazel+label:migration-0.23
It surprinsingly doesn't include incompatible_no_transitive_loads (bazelbuild/bazel#5636)

cc @meteorcloudy

Potential for improved excellence on slow network

Dear Philwo,

Thank you for fantastic script! I'm operating on a extremely moody network currently, and at times of slowly flying pigeons bazelisk and intellij fight against each other with this error message:

Traceback (most recent call last):
  File "/home/m/bin/bazel", line 116, in <module>
    sys.exit(main())
  File "/home/m/bin/bazel", line 113, in main
    return subprocess.Popen([bazel_path] + argv[1:], close_fds=True).wait()
  File "/usr/lib/python3.6/subprocess.py", line 709, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.6/subprocess.py", line 1344, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 26] Text file busy: '/home/m/.bazelisk/bin/bazel-0.18.0-linux-x86_64'

In addition, I'm starring at Downloading https://releases.bazel.build/0.18.0/release/bazel-0.18.0-linux-x86_64... for a while now, and I'm wondering if it's doing anything, maybe progress bar would be nice :P

Best regards, and thank you!
big fan,
m.

Take advantage of //tools/bazel?

Just a random thought, this seems a great approach for handling bazel version issue in a non-managed environment but asking users to install this is still a challenge.

Given that bazel will try to invoke //tools/bazel if exists, so how about placing a shell script there to download and run the proper version of bazel instead?

Flag --incompatible_use_platforms_repo_for_constraints will break Bazelisk in Bazel 1.2.1

Incompatible flag --incompatible_use_platforms_repo_for_constraints will break Bazelisk once Bazel 1.2.1 is released.

Please see the following CI builds for more information:

Questions? Please file an issue in https://github.com/bazelbuild/continuous-integration

Important: Please do NOT modify the issue title since that might break our tools.

Keep just one version of bazelisk

Currently we have both python and Go versions; looks like they are losing feature parity. Let's keep just one (I guess the Go version?)

Official bazelisk docker image

Consider publishing official bazelisk docker images, aka gcr.io/whatever/bazelisk:1.0 etc (maybe versions that have bazel version A B C preinstalled too)

Bugs with x86_64 arch detection and running on Windows

Hi @philwo. I've been working on junit-team/junit5-samples#93 recently, where I'm thinking of incorporating Bazelisk to allow users of that project to run Bazel-based JUnit 5 samples without needing to install Bazel beforehand. But in doing so, I saw a couple of bugs:

  1. Bazelisk currently doesn't recognise amd64 and AMD64 as aliases of x86_64, so it incorrectly throws an exception when running of machines that advertise such architecture IDs (as mine does).
  2. When downloading Bazel on Windows, Bazelisk attempts to download https://github.com/bazelbuild/bazel/releases/download/<version>/bazel-<version>-windows-x86_64, which AFAICT doesn't exist and instead should be https://github.com/bazelbuild/bazel/releases/download/<version>/bazel-<version>-windows-x86_64.exe. (The former is missing the .exe.)

I have a fix for both these bugs on my machine, but I wanted to gauge interest in me submitting a PR before I do so.

Thoughts? :)

Support for offline mode with previously installed bazelisk

Currently if I run bazelisk, when my PC is in offline mode, it fails to run my build/test tasks as it is not able to connect to the internet and validate that it is running the latest version.

$ ./tools/bin/bazelisk-darwin-amd64 help
2019/09/08 08:15:36 could not resolve the version 'latest' to an actual version number: could not get releases from github.com/bazelbuild/bazel: could not download list of Bazel releases from github.com/bazelbuild: could not fetch https://api.github.com/repos/bazelbuild/bazel/releases: Get https://api.github.com/repos/bazelbuild/bazel/releases: dial tcp: lookup api.github.com: no such host
$

It would be great if it could simply print a warning message about this and continue with running the bazel build/test tasks. And perhaps provide an option to run bazelisk in offline mode so that it doesn't have to print warning message.

v0.0.5 release?

Will there be a release soon? Eagerly awaiting the //tools/bazel support. Thanks!

Ready for broad use?

(Really a question more than an issue)
I'm part of a team with plans to finish a large Maven-to-Bazel migration in the next month or so. One of the last things that's been worrying me was how to handle the nice (but scarily quick) Bazel release cadence. When I saw that Bazelisk allows you to pin people to a specific version and handle the downloading/set-up, I was super excited. Would you feel comfortable rolling it out to a team of over 100 engineers at this point or do you think I should wait for it to stabilize?

Signature verification support

Bazel release candidates and releases are accompanied by PGP signatures:

$ wget -q 'https://releases.bazel.build/0.20.0/rc1/bazel-0.20.0rc1-darwin-x86_64'
$ wget -q 'https://releases.bazel.build/0.20.0/rc1/bazel-0.20.0rc1-darwin-x86_64.sig'
$ gpg --verify ./bazel-0.20.0rc1-darwin-x86_64.sig
gpg: assuming signed data in './bazel-0.20.0rc1-darwin-x86_64'
gpg: Signature made Mon 05 Nov 2018 06:16:24 AM PST
gpg:                using RSA key 71A1D0EFCFEB6281FD0437C93D5919B448457EE0
gpg: Good signature from "Bazel Developer (Bazel APT repository key) <[email protected]>" [full]
$ wget -q 'https://releases.bazel.build/0.21.0/release/bazel-0.21.0-linux-x86_64'
$ wget -q 'https://releases.bazel.build/0.21.0/release/bazel-0.21.0-linux-x86_64.sig'
$ gpg --verify ./bazel-0.21.0-linux-x86_64.sig
gpg: assuming signed data in './bazel-0.21.0-linux-x86_64'
gpg: Signature made Wed 19 Dec 2018 05:58:23 AM PST
gpg:                using RSA key 71A1D0EFCFEB6281FD0437C93D5919B448457EE0
gpg: Good signature from "Bazel Developer (Bazel APT repository key) <[email protected]>" [full]

Would you be interested in a pull request to make Bazelisk additionally
download and verify these signatures? (Signature verification is fast:
about a second on my machine.)

The Bazel team public key would be hard-coded into the repository, and
we can use

$ gpg --no-default-keyring --keyring ./bazel-release.pub.gpg \
> --trust-model always --verify "${SIGNATURE}" "${BINARY}"

to verify the binary. (This requires the bazel-release.pub.gpg key to
be dearmored, but that’s easy to do.)

Migrate not strict enough for some flags

In our testing with bazelisk migrate we've noticed that bazelisk doesn't clean up enough between builds to make sure it's correct about whether or not a flag needs to be migrated.

In our specific case testing migrate with 0.27.0 we get an initial failure with all the flags:

bazel build --config=QA --apple_platform_type=ios //Modules/... --incompatible_disable_legacy_proto_provider --incompatible_disable_native_android_rules --incompatible_disable_proto_source_root --incompatible_disallow_legacy_java_provider --incompatible_disallow_legacy_javainfo --incompatible_enable_cc_toolchain_resolution --incompatible_make_thinlto_command_lines_standalone --incompatible_no_target_output_group --incompatible_remap_main_repo --incompatible_remove_legacy_whole_archive --incompatible_require_java_toolchain_header_compiler_direct --incompatible_restrict_named_params --incompatible_use_aapt2_by_default --incompatible_windows_native_test_wrapper

Loading:
Loading: 0 packages loaded
Analyzing: 2143 targets (470 packages loaded, 0 targets configured)
Analyzing: 2143 targets (715 packages loaded, 15147 targets configured)
Analyzing: 2143 targets (802 packages loaded, 21675 targets configured)
INFO: Analyzed 2143 targets (802 packages loaded, 24113 targets configured).
Building: checking cached actions
INFO: Found 2143 targets...
INFO: Deleting stale sandbox base /private/var/tmp/_bazel_iosci/4da19724c573aed48a58c78a6f864623/sandbox
[8 / 34] [Prepa] Writing file Modules/MapToastListeners/MapToastListeners.output_file_map.json
[497 / 557] Compiling Swift module GlobalSupportService; 1s local ... (12 actions, 11 running)
[579 / 638] AssetCatalogCompile Modules/CoreUI/CoreUIResources-intermediates/xcassets; 2s local ... (12 actions, 10 running)
[690 / 747] AssetCatalogCompile Modules/CoreUI/CoreUIResources-intermediates/xcassets; 4s local ... (12 actions, 11 running)
[832 / 931] AssetCatalogCompile Modules/CoreUI/CoreUIResources-intermediates/xcassets; 6s local ... (12 actions, 11 running)
[930 / 1,083] AssetCatalogCompile Modules/CoreUI/CoreUIResources-intermediates/xcassets; 9s local ... (12 actions, 11 running)
[1,062 / 1,287] AssetCatalogCompile Modules/CoreUI/CoreUIResources-intermediates/xcassets; 12s local ... (12 actions running)
[1,129 / 1,361] AssetCatalogCompile Modules/CoreUI/CoreUIResources-intermediates/xcassets; 15s local ... (12 actions running)
[1,192 / 1,407] AssetCatalogCompile Modules/CoreUI/CoreUIResources-intermediates/xcassets; 19s local ... (12 actions running)
[1,224 / 1,415] AssetCatalogCompile Modules/CoreUI/CoreUIResources-intermediates/xcassets; 24s local ... (12 actions running)
[1,270 / 1,421] Compiling Swift module StreamingService; 19s local ... (12 actions running)
ERROR: /Users/iosci/Desktop/src/iosci32/lyft/ios/Modules/MapToastListeners/BUILD:22:1: Linking of rule '//Modules/MapToastListeners:MapToastListenersTests' failed (Exit 1)

But then none of the migration flags fail with this. But if I bisect this on my own I discovered this issue is caused by --incompatible_enable_cc_toolchain_resolution. Knowing this I can reproduce it after a clean, but then if I remove it, and add it back, the build is a no-op:

% bazelisk build --config=QA --apple_platform_type=ios //Modules/MapToastListeners:MapToastListenersTests --incompatible_enable_cc_toolchain_resolution
INFO: Analyzed target //Modules/MapToastListeners:MapToastListenersTests (99 packages loaded, 3740 targets configured).
INFO: Found 1 target...
ERROR: /Users/ksmiley/dev/lyft/Lyft-iOS/Modules/MapToastListeners/BUILD:22:1: Linking of rule '//Modules/MapToastListeners:MapToastListenersTests' failed (Exit 1)
clang: warning: using sysroot for 'MacOSX' but targeting 'iPhone' [-Wincompatible-sysroot]
ld: framework not found UIKit
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Target //Modules/MapToastListeners:MapToastListenersTests failed to build
Use --verbose_failures to see the command lines of failed build steps.
INFO: Elapsed time: 105.531s, Critical Path: 62.41s
INFO: 310 processes: 310 local.
FAILED: Build did NOT complete successfully

% bazelisk build --config=QA --apple_platform_type=ios //Modules/MapToastListeners:MapToastListenersTests
INFO: Build option --incompatible_enable_cc_toolchain_resolution has changed, discarding analysis cache.
INFO: Analyzed target //Modules/MapToastListeners:MapToastListenersTests (0 packages loaded, 3742 targets configured).
INFO: Found 1 target...
Target //Modules/MapToastListeners:MapToastListenersTests up-to-date:
  bazel-bin/Modules/MapToastListeners/MapToastListenersTests.zip
  bazel-bin/Modules/MapToastListeners/MapToastListenersTests
INFO: Elapsed time: 6.074s, Critical Path: 5.37s
INFO: 5 processes: 5 local.
INFO: Build completed successfully, 7 total actions

% bazelisk build --config=QA --apple_platform_type=ios //Modules/MapToastListeners:MapToastListenersTests --incompatible_enable_cc_toolchain_resolution
INFO: Build option --incompatible_enable_cc_toolchain_resolution has changed, discarding analysis cache.
INFO: Analyzed target //Modules/MapToastListeners:MapToastListenersTests (0 packages loaded, 3748 targets configured).
INFO: Found 1 target...
Target //Modules/MapToastListeners:MapToastListenersTests up-to-date:
  bazel-bin/Modules/MapToastListeners/MapToastListenersTests.zip
  bazel-bin/Modules/MapToastListeners/MapToastListenersTests
INFO: Elapsed time: 0.635s, Critical Path: 0.02s
INFO: 0 processes.
INFO: Build completed successfully, 1 total action

This might be an implementation detail of this flag and what it does, but it surprised us that we couldn't fully trust that migrate was showing us true true results.

support external servers for internal builds

bazelisk is a really nice concept - would be more useful to me by having easily able to use a particular host for bazel builds, which may not be upstream's builds (or hashes).

What might build a bridge to supporting that well? Listing providers in the .bazelversion? What about on the server side?

Bazelisk does not honor locally installed bazel version

On our CI docker we install Bazel version from the official Debian image,
that corresponds to the .bazelversion file, by using official Bazel version:

https://releases.bazel.build/1.0.0/rc2/bazel_1.0.0rc2-linux-x86_64.deb

In the same time we install bazelisk, version 1.0 on CI docker image.

If I run bazelisk build :release and .bazelversion is 1.0.0rc2, and locally the right version of Bazel is installed, I would expect that Bazelisk is smart enough, to use that version.

What happens, is yet another instance of Bazel is downloaded by Bazelisk:

davido@wizball:~/projects/gerrit$ bazel version
Build label: 1.0.0rc2
Build target: bazel-out/k8-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Fri Sep 6 12:17:09 2019 (1567772229)
Build timestamp: 1567772229
Build timestamp as int: 1567772229

davido@wizball:~/projects/gerrit$ which bazel     
/usr/bin/bazel

davido@wizball:~/projects/gerrit$ cat .bazelversion 
1.0.0rc2

davido@wizball:~/projects/gerrit$ bazelisk build java/com/google/gerrit/server:server
2019/09/10 21:43:16 Downloading https://releases.bazel.build/1.0.0/rc2/bazel-1.0.0rc2-linux-x86_64...
INFO: Writing tracer profile to '/home/jenkins/.cache/bazel/_bazel_jenkins/4e8644684552b40c50dc624b79e09982/command.profile.gz'
INFO: Invocation ID: 3e92d1fa-39a5-4266-a806-642073c70b89
INFO: Analyzed target //java/com/google/gerrit/server:server (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //java/com/google/gerrit/server:server up-to-date:
  bazel-bin/java/com/google/gerrit/server/libserver.jar
INFO: Elapsed time: 0.625s, Critical Path: 0.21s
INFO: 0 processes.
INFO: Build completed successfully, 1 total action

And now yet additional Bazel version was downloaded by Bazelisk and is located here:

/home/davido/.cache/bazelisk/bin/bazelbuild/bazel-1.0.0rc2-linux-x86_64

Basic usage documentation for a newbie

Dear developers,

Background:
I try to build tensorflow from source for my old laptop (there is no binary for my architechture).
Tensorflow recommends using bazelisk, which sounds good to me because I remember having had hard time with bazel earlier. I'm typically using python only and do not remember how to compile programs.

Wish:
I could not easily understand from bazelisk documantion how to build the binary by reading README.md
I guessed

bazelisk build //..

followed by

sudo cp /home/mka/.cache/bazel/_bazel_mka/5fc3e201f16bb551d14b225bd588a7bf/execroot/__main__/bazel-out/k8-fastbuild/bin/linux_amd64_stripped/bazelisk  /usr/local/bin/bazel

So could you add to README.md very basic usage example
(for instance for compiling tensorflow in mind)

Go seems to be available vie snap in ubuntu 18.04 which you also could mention.

Final Failure:

(tf2) mka@mkaHemLap:~/git/tensorflow$ ./configure
2019/11/10 10:56:13 Downloading https://releases.bazel.build/0.26.1/release/bazel-0.26.1-linux-x86_64...
Extracting Bazel installation...
WARNING: --batch mode is deprecated. Please instead explicitly shut down your Bazel server using the command "bazel shutdown".
You have bazel 0.26.1 installed.
Please upgrade your bazel installation to version 0.27.1 or higher to build TensorFlow!

terveisin, Markus

Version in .bazelversion should be respected without WORKSPACE file

Issue

Executing the pre-built bazelisk binary doesn't seem to respect the value in a .bazelversion file when executed from the directory containing the file. The binary downloads the latest version of Bazel instead. Setting USE_BAZEL_VERSION picks up the correct version from the environment variable.

I believe the issue is that the determination of the .bazelversion file relies on the existence of a WORKSPACE file. For some of the "infrastructure" commands e.g. version, help, info this shouldn't be required.

How to reproduce?

  1. Download bazelisk binary (in my case bazelisk-darwin-amd64)
  2. Add the binary to PATH and add execution permission
cp bazelisk /Users/bmuschko/dev/tools/bazelisk
chmod +x /Users/bmuschko/dev/tools/bazelisk
export PATH=/Users/bmuschko/dev/tools:$PATH
  1. Create a new directory and navigate to it
mkdir my-project
cd my-project
  1. Add .bazelversion with version 0.21.0
echo 0.21.0 > .bazelversion
  1. Run bazelisk version
Build label: 0.24.1
Build target: bazel-out/darwin-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Tue Apr 2 16:32:47 2019 (1554222767)
Build timestamp: 1554222767
Build timestamp as int: 1554222767

Universal shell scripts to run baselisk

What do you think about having files with native shell scripts like gradle wrapper have? Somthing like this:

#!/usr/bin/env sh

##############################################################################
##
##  Bazel start up script for UN*X (based on gradlew script from gradle wrapper project)
##
##
##############################################################################

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

APP_NAME="bazelisk"
APP_BASE_NAME=`basename "$0"`

warn () {
    echo "$*"
}

die () {
    echo
    echo "$*"
    echo
    exit 1
}

## Determine OS.
darwin=false
linux=false

case "`uname`" in
  Darwin* )
    darwin=true
    ;;
  Linux* )
    linux=true
    ;;
esac

BINARY_PATH=""
if $darwin; then
    BINARY_PATH=bazelisk-darwin-amd64
elif $linux; then
    BINARY_PATH=bazelisk-linux-amd64
else
   die "UNSUPPORTED OS! Command 'uname' says: `uname`. 'darwin' = $darwin and 'linux' = $linux"
fi


exec "$APP_HOME/bazelisk/$BINARY_PATH" "$@"

while having bazelisk binaries inside VCS repo?

Wants to download bazel 0.18.1 as latest version

Bazel 0.18.1 was released after 0.19.0 and now when there is no .bazelversion supplied bazeilsk is trying to download 0.18.1. My feeling would be that we would want it to download 0.19.0. But what do you think?

Create bazelisk --bisect

It would be awesome if bazelisk had an option to bisect build failures locally, like it's proposed in the Ideas for the future section of the readme.

As a starting point, we could limit it to last_green versions of Bazel where we already have a compiled binary. That should hopefully narrow it down to a sufficiently small range of commits so see the culprint.

Flag --incompatible_no_implicit_file_export will break Bazelisk in a future Bazel release

Incompatible flag --incompatible_no_implicit_file_export will be enabled by default in a future Bazel release [1], thus breaking Bazelisk.

The flag is documented here: bazelbuild/bazel#10225

Please check the following CI builds for build and test results:

Never heard of incompatible flags before? We have documentation that explains everything.

If you don't want to receive any future issues for Bazelisk or if you have any questions,
please file an issue in https://github.com/bazelbuild/continuous-integration

Important: Please do NOT modify the issue title since that might break our tools.

[1] The target release hasn't been determined yet. Our tool will update the issue title once the flag flip has been scheduled.

Support for Installing Custom Bazel Versions

We use a fork for Bazel at Lucid Software because we utilize features in Bazel that are still in code review or are too premature for a pull request to the main Bazel repo.

We would like to be able to use Bazelisk with our fork of the Bazel repo, so we can manage Bazel upgrades while on a custom version of Bazel.

Currently Bazelisk only supports downloading official releases.

fmt.Sprintf("https://releases.bazel.build/%s/%s/%s", version, kind, filename)

It would be nice to have an option to choose between the normal GitHub release URL like

fmt.Sprintf("https://github.com/%s/bazel/releases/download/%s/%s", remote, version, filename)

We already have a prototype. We are happy to draft a PR or draft a design document. Thanks for your consideration.

//tools/bazel wrapper not executed

It seems bazelisk installs a bazel version that doesn't use the bazel.sh wrapper found in the standard distribution. It also doesn't add a bazel-real to the PATH. This prevents //tools/bazel wrappers from working.

ctrl-c during download leaves you in a broken state

I control-c'd during the download of a new bazel version, and the next time I ran bazelisk I was hit with:

% bazelisk test //test/exe:main_common_test --define=google_grpc=disabled --define=signal_trace=disabled --define=tcmalloc=disabled
WARNING: The following rc files are no longer being read, please transfer their contents or import their path into one of the standard rc files:
/home/keith/dev/envoy/tools/bazel.rc
file is invalid or corrupted (missing end of central directory record)
Cannot find central directory
FATAL: Failed to open Bazel as a zip file: (error: 5): Input/output error

In order to fix this I had to rm -rf ~/.bazelisk and run it again

Add support for source fetching + building

Right now bazelisk fetches binary distributions via github releases, I'm curious if adding support for source based fetching + building is something being considered or would be okay to contribute?

Perhaps some extra syntax in .bazelversion that instructs bazelisk to fetch a zip of some given sha/tag and build a release of bazel locally, and use that as the underlying bazel binary.

"go get" command in README.md fails in module mode

Issue:
The "go get" command in README.md doesn't function when go.mod is parsed
go get github.com/bazelbuild/bazelisk
This effect was recreated with three out of four users trying to install bazelisk, so it's somewhat flaky.

Behavior:

$ go get github.com/bazelbuild/bazelisk
go: github.com/bazelbuild/[email protected]: parsing go.mod: unexpected module path "github.com/philwo/bazelisk"
go: error loading module requirements

Possible Cause:
I believe that the go.mod file is referencing the wrong repository

Support bazel-watcher (iBazel)

Are there any plans to support using bazel-watcher through bazelisk?

Adding something like a "--watch" option to bazelisk would be awesome in my opinion.

I'd be happy to try and contribute it myself if given a few pointers on what the solution should look like :)

Feature request: resolve latest version of Bazel from something other than GitHub's APIs

In #18 it was mentioned that Bazelisk can fail because GitHub will rate limit IPs, which can be a problem on shared networks.

{
    "message": "API rate limit exceeded for 64.235.99.100. (But here's the good news: Authenticated 
    requests get a higher rate limit. Check out the documentation for more details.)",
    "documentation_url": "https://developer.github.com/v3/#rate-limiting"
}

We hit this in our office because we generate our WORKSPACE in our non-Bazel build (as we migrate) and sometimes users do a clean build which deletes this file. Bazelisk will only use .bazelrc if it's beside a WORKSPACE file.

Our fix is to generate our Bazel build before invoking Bazel, which is totally reasonable/the right thing for us. It would still probably be good for Bazelisk to use non-GitHub infrastructure for resolving the latest version, as mentioned in #18 (it would have hidden our bug, which would suck for us, but it seems like the right thing for Bazelisk).

Interaction with pyenv is breaking

I'm not sure if this will be controversial as an issue, but I wanted to share a challenge I've faced trying to get Bazelisk working for my codebase. It has a lot to do with the lack of interpreter hermeticity in the Python rules, which is a separate problem, so this "issue" may also resolve itself in the future.

So, what happens is: if you manage your Python by way of pyenv, the hashbang in this script (#!/usr/bin/env python3) will resolve to the pyenv shim for python 3. This will prepend things to PATH, and spawned subprocess will inherit the mutated PATH as its environment. Further usage of python after bazelisk hands off control, then, end up getting forced onto python 3.

You could absolutely say this not Bazelisk's problem, but for what's it's worth, I worked around this by refactoring the script to be py2-compatible, and using #!/usr/bin/python as the hashbang - this should be portable across OSX and Linux, for the time being, and I'm hopeful the Bazel Python ecosystem will continue to improve so this is not something we have to worry about outside of the python rules themselves.

Flag --incompatible_no_implicit_file_export will break Bazelisk in Bazel 1.2.1

Incompatible flag --incompatible_no_implicit_file_export will break Bazelisk once Bazel 1.2.1 is released.

Please see the following CI builds for more information:

Questions? Please file an issue in https://github.com/bazelbuild/continuous-integration

Important: Please do NOT modify the issue title since that might break our tools.

--migrate feature: Incompatible flags should be added before "--"

When running bazelisk --migrate test -- //:tests, Bazelisk adds incompatible flags after --, which makes Bazel think --incompatible_** is a target name.

This is causing failures in https://buildkite.com/bazel/bazelisk-plus-incompatible-flags/builds/5#45409a0d-2175-4452-aac9-a37ccbce2466

bazel --output_user_root=D:/b test --flaky_test_attempts=3 --build_tests_only --local_test_jobs=8 --show_progress_rate_limit=5 --curses=yes --color=yes --verbose_failures --keep_going --jobs=32 --announce_rc --experimental_multi_threaded_digest --experimental_build_event_json_file_path_conversion=false --build_event_json_file=D:\temp\tmpcpd4np6y\test_bep.json --remote_timeout=60 --disk_cache= --remote_max_connections=200 --host_platform_remote_properties_override=properties:{name:"platform" value:"windows"} --google_default_credentials --remote_http_cache=https://storage.googleapis.com/bazel-untrusted-buildkite-cache --enable_runfiles --test_env=LocalAppData -- //:tests -//extra_actions_base_proto:extra_actions_base.gen.pb.go_checkshtest --incompatible_disable_deprecated_attr_params
--
  | INFO: Invocation ID: d82f2406-8403-498d-a56d-638ea5a7a3b1
  | INFO: Options provided by the client:
  | Inherited 'common' options: --isatty=0 --terminal_columns=80
  | INFO: Options provided by the client:
  | Inherited 'build' options: --python_path=C:/python3/python.exe
  | DEBUG: Rule 'bazel_skylib' modified arguments {"shallow_since": "1528913834 -0400"}
  | ERROR: Skipping '-incompatible_disable_deprecated_attr_params': no such target '//:-incompatible_disable_deprecated_attr_params': target '-incompatible_disable_deprecated_attr_params' not declared in package '' defined by D:/b/bk-windows-java8-88vj/bazel-downstream-projects/buildtools/BUILD.bazel

@laurentlb

undefined: os.UserCacheDir

I am trying to install Go version as it describes in README.md, but I got a message when I ran

go get github.com/bazelbuild/bazelisk

The message is

# github.com/bazelbuild/bazelisk
go/src/github.com/bazelbuild/bazelisk/bazelisk.go:606:24: undefined: os.UserCacheDir

I am running

Ubuntu 18.04.1 LTS
go version go1.10.4 linux/amd64

Could anyone take a look what I did wrong? Thanks.

RE: Tensorflow, Bazel, and Bazelisk: armhf on BBAI?

Hello,

I am trying to use my 32 bit controller, the BBAI, to compile some source and get tensorflow on my machine so that I can use openCV one day. I came across this idea of Bazel and Bazelisk on the tensorflow site under install.

I am stuck w/ this bunch of error messages:

The system is out of resources.
Consult the following stack trace for details.
java.lang.OutOfMemoryError: Java heap space

Is there a light version or another way to go about getting tensorflow on my Debian Stretch Distro? I saw that Buster will start to incorporate items for development. I am on kernel 4.14.x.

Seth

P.S. I know this is a RAM issue, most likely on my end, but I am reaching out nevertheless with trying to find ways to get tensorflow on the machine of choice. If you know what issues I am describing, please do reply.

Flakyness when using Bazelisk on GCB builds

We recently switched to using Bazelisk in many tests that run on bazel-toolchains repo using GCB triggers. Today we're seeing some of our builds fail with the following error:
Step #0: 2019/06/28 17:42:34 could not download Bazel: could not copy from https://releases.bazel.build/0.27.0/release/bazel-0.27.0-linux-x86_64 to /root/.cache/bazelisk/bin/download895442339: stream error: stream ID 1; INTERNAL_ERROR
Seems to be flakiness, as retrying the test usually succeeds

bazelisk migrate from really old version

I have a project which builds with bazel 0.15 but doesn't build with bazel at HEAD (I know I should have updated in between) so I have ~15 Bazel versions to test my project with. Now, it would be really great if you could tell bazelisk which version is the last known Bazel version with which my project did successfully build and bazelisk should try with each new released Bazel version since then and compile a report.
If the build fails with Bazel X and fails with Bazel X+1, then bazelisk should additionally repeat the build with the --migrate option with Bazel version X.

Support GitHub API Token

If you're on a shared network, you can sometimes see messages like this from the API:

$ curl https://api.github.com/repos/bazelbuild/bazel/releases
{
  "message": "API rate limit exceeded for 123.45.67.89. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)",
  "documentation_url": "https://developer.github.com/v3/#rate-limiting"
}

Homebrew (for instance) has support for supplying a token via HOMEBREW_GITHUB_API_TOKEN, making it more likely that the API request won't get rate limited. It would be nice for bazelisk to support this as well, perhaps via a similar convention (BAZELISK_GITHUB_API_TOKEN) to perform authenticated requests instead.

Write tests and enable CI.

We should write some simple tests for Bazelisk and then test it via Buildkite on Linux, macOS and Windows.

Version information

One feature that I'm missing, is a way to troubleshoot if a user is using bazelisk vs the raw bazel.

This is especially useful if the bazelisk binary is installed as bazel.

My proposal is that bazelisk should intercept bazelisk version and prepend or append the bazelisk version to the output, like so:

$ bazelisk version
Bazelisk version: 0.0.5
Build label: 0.26.0
Build target: bazel-out/darwin-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Tue May 28 08:38:24 2019 (1559032704)
Build timestamp: 1559032704
Build timestamp as int: 1559032704

Release python binary for inclusion in projects

My users use a combination of Linux, OS X, and Windows, but can be relied upon to have a basic python installation present. Since they may not have installed the various pips required by bazelisk, it would be useful if bazelisk were a single deployable python binary (similar to a PEX) that could be included at the root of the project.

This would provide multi-platform support easily without bloating the repo. Having a binary per platform won't work in this case, since I'm working on an Open Source project, and it's hard enough to get people to install the baseline requirements.

Downloads should be validated

The .bazelversion file should allow developers to specify the SHAs of the files downloaded so that we can rest easy knowing that the bazel used by bazelisk is, well, not tainted.

Provide a macOS installer

I see that the "ideas for improvement" in the front page contains:

  • Add a Homebrew recipe for Bazelisk to make it easy to install on macOS.

... and I have quite a dislike for Homebrew. I'd suggest to provide a native macOS installer that places this tool in the correct location instead. It's actually quite easy to do so and avoids the need to install Homebrew (which some users may not have, like me, as I use pkgsrc).

Anyway, my main goal was to let you know that the packaging script I wrote for sandboxfs may help you get started: https://github.com/bazelbuild/sandboxfs/blob/master/admin/make-macos-pkg.sh . Was going to send you an email about this, but hey, I can also send this to you via a FR.

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.