diff --git a/docs/Built-ins.md b/docs/Built-ins.md index b1bca3c5a2..51805c7d5b 100755 --- a/docs/Built-ins.md +++ b/docs/Built-ins.md @@ -1430,7 +1430,9 @@ check if yarn is being run by the `yarn_install` repository rule. (*List of strings*): Arguments passed to yarn install. -See yarn CLI docs https://yarnpkg.com/en/docs/cli/install for complete list of supported arguments. +See yarn CLI docs for complete list of supported arguments. +Yarn 1: https://yarnpkg.com/en/docs/cli/install +Yarn 2+: https://yarnpkg.com/cli/install Defaults to `[]` @@ -1517,7 +1519,9 @@ Defaults to `False`

frozen_lockfile

-(*Boolean*): Use the `--frozen-lockfile` flag for yarn. +(*Boolean*): Use the `--frozen-lockfile` flag for yarn 1 + +Users of Yarn 2+ (Berry) should just pass `--immutable` to the `args` attribute. Don't generate a `yarn.lock` lockfile and fail if an update is needed. @@ -1841,7 +1845,8 @@ have bugs. Disabling this attribute causes every run of yarn to have a unique cache_directory. -If True, this rule will pass `--mutex network` to yarn to ensure that +If True, this rule will pass +`--mutex network` to yarn 1 or to ensure that the global cache can be shared by parallelized yarn_install rules. If False, this rule will pass `--cache-folder /path/to/external/repository/__yarn_cache` diff --git a/internal/npm_install/npm_install.bzl b/internal/npm_install/npm_install.bzl index adfcef1356..cbf137d4cd 100644 --- a/internal/npm_install/npm_install.bzl +++ b/internal/npm_install/npm_install.bzl @@ -813,18 +813,29 @@ def _yarn_install_impl(repository_ctx): is_windows_host = is_windows_os(repository_ctx) node = repository_ctx.path(get_node_label(repository_ctx)) yarn = get_yarn_label(repository_ctx) + result = repository_ctx.execute( + [repository_ctx.path(yarn), "--version"], + timeout = repository_ctx.attr.timeout, + quiet = repository_ctx.attr.quiet, + ) + if result.return_code: + fail("yarn --version failed: %s (%s)" % (result.stdout, result.stderr)) + if result.stdout.startswith("1."): + yarn_version = "classic" + else: + yarn_version = "berry" yarn_args = [] # Set frozen lockfile as default install to install the exact version from the yarn.lock # file. To perform an yarn install use the vendord yarn binary with: # `bazel run @nodejs//:yarn install` or `bazel run @nodejs//:yarn install -- -D ` - if repository_ctx.attr.frozen_lockfile: + if repository_ctx.attr.frozen_lockfile and yarn_version == "classic": yarn_args.append("--frozen-lockfile") if not repository_ctx.attr.use_global_yarn_cache: yarn_args.extend(["--cache-folder", str(repository_ctx.path("_yarn_cache"))]) - else: + elif yarn_version == "classic": # Multiple yarn rules cannot run simultaneously using a shared cache. # See https://github.com/yarnpkg/yarn/issues/683 # The --mutex option ensures only one yarn runs at a time, see @@ -832,6 +843,10 @@ def _yarn_install_impl(repository_ctx): # The shared cache is not necessarily hermetic, but we need to cache downloaded # artifacts somewhere, so we rely on yarn to be correct. yarn_args.extend(["--mutex", "network"]) + else: + # Can't tell from documentation if Yarn Berry has any replacement for the --mutex + # flag. We'll have to assume it's safe to run concurrently. + pass yarn_args.extend(repository_ctx.attr.args) # Run the package manager in the package.json folder @@ -936,12 +951,17 @@ yarn_install = repository_rule( "args": attr.string_list( doc = """Arguments passed to yarn install. -See yarn CLI docs https://yarnpkg.com/en/docs/cli/install for complete list of supported arguments.""", +See yarn CLI docs for complete list of supported arguments. +Yarn 1: https://yarnpkg.com/en/docs/cli/install +Yarn 2+: https://yarnpkg.com/cli/install +""", default = [], ), "frozen_lockfile": attr.bool( default = True, - doc = """Use the `--frozen-lockfile` flag for yarn. + doc = """Use the `--frozen-lockfile` flag for yarn 1 + +Users of Yarn 2+ (Berry) should just pass `--immutable` to the `args` attribute. Don't generate a `yarn.lock` lockfile and fail if an update is needed. @@ -964,7 +984,8 @@ have bugs. Disabling this attribute causes every run of yarn to have a unique cache_directory. -If True, this rule will pass `--mutex network` to yarn to ensure that +If True, this rule will pass +`--mutex network` to yarn 1 or to ensure that the global cache can be shared by parallelized yarn_install rules. If False, this rule will pass `--cache-folder /path/to/external/repository/__yarn_cache`