---
title: 'module\_ctx'
---

The context of the module extension containing helper functions and information about pertinent tags across the dependency graph. You get a module\_ctx object as an argument to the `implementation` function when you create a module extension.

## Members

* [download](#download)
* [download\_and\_extract](#download_and_extract)
* [execute](#execute)
* [extension\_metadata](#extension_metadata)
* [extract](#extract)
* [file](#file)
* [getenv](#getenv)
* [is\_dev\_dependency](#is_dev_dependency)
* [modules](#modules)
* [os](#os)
* [path](#path)
* [read](#read)
* [report\_progress](#report_progress)
* [root\_module\_has\_non\_dev\_dependency](#root_module_has_non_dev_dependency)
* [watch](#watch)
* [which](#which)

## download

```
unknown module_ctx.download(url, output='', sha256='', executable=False, allow_fail=False, canonical_id='', auth={}, headers={}, *, integrity='', block=True)
```

Downloads a file to the output path for the provided url and returns a struct containing `success`, a flag which is `true` if the download completed successfully, and if successful, a hash of the file with the fields `sha256` and `integrity`. When `sha256` or `integrity` is user specified, setting an explicit `canonical_id` is highly recommended. e.g. [`get_default_canonical_id`](/versions/8.4.2/rules/lib/repo/cache#get_default_canonical_id)

### Parameters

| Parameter | Description |
| --- | --- |
| `url` | [string](/versions/8.4.2/rules/lib/core/string); or Iterable of [string](/versions/8.4.2/rules/lib/core/string)s; required  List of mirror URLs referencing the same file. |
| `output` | [string](/versions/8.4.2/rules/lib/core/string); or [Label](/versions/8.4.2/rules/lib/builtins/Label); or [path](/versions/8.4.2/rules/lib/builtins/path); default is `''`  path to the output file, relative to the repository directory. |
| `sha256` | [string](/versions/8.4.2/rules/lib/core/string); default is `''`  The expected SHA-256 hash of the file downloaded. This must match the SHA-256 hash of the file downloaded. It is a security risk to omit the SHA-256 as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given hash; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. |
| `executable` | [bool](/versions/8.4.2/rules/lib/core/bool); default is `False`  Set the executable flag on the created file, false by default. |
| `allow_fail` | [bool](/versions/8.4.2/rules/lib/core/bool); default is `False`  If set, indicate the error in the return value instead of raising an error for failed downloads. |
| `canonical_id` | [string](/versions/8.4.2/rules/lib/core/string); default is `''`  If set, restrict cache hits to those cases where the file was added to the cache with the same canonical id. By default caching uses the checksum (`sha256` or `integrity`). |
| `auth` | [dict](/versions/8.4.2/rules/lib/core/dict); default is `{}`  An optional dict specifying authentication information for some of the URLs. |
| `headers` | [dict](/versions/8.4.2/rules/lib/core/dict); default is `{}`  An optional dict specifying http headers for all URLs. |
| `integrity` | [string](/versions/8.4.2/rules/lib/core/string); default is `''`  Expected checksum of the file downloaded, in Subresource Integrity format. This must match the checksum of the file downloaded. It is a security risk to omit the checksum as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given checksum; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. |
| `block` | [bool](/versions/8.4.2/rules/lib/core/bool); default is `True`  If set to false, the call returns immediately and instead of the regular return value, it returns a token with one single method, wait(), which blocks until the download is finished and returns the usual return value or throws as usual. |

## download\_and\_extract

```
struct module_ctx.download_and_extract(url, output='', sha256='', type='', strip_prefix='', allow_fail=False, canonical_id='', auth={}, headers={}, *, integrity='', rename_files={})
```

Downloads a file to the output path for the provided url, extracts it, and returns a struct containing `success`, a flag which is `true` if the download completed successfully, and if successful, a hash of the file with the fields `sha256` and `integrity`. When `sha256` or `integrity` is user specified, setting an explicit `canonical_id` is highly recommended. e.g. [`get_default_canonical_id`](/versions/8.4.2/rules/lib/repo/cache#get_default_canonical_id)

### Parameters

| Parameter | Description |
| --- | --- |
| `url` | [string](/versions/8.4.2/rules/lib/core/string); or Iterable of [string](/versions/8.4.2/rules/lib/core/string)s; required  List of mirror URLs referencing the same file. |
| `output` | [string](/versions/8.4.2/rules/lib/core/string); or [Label](/versions/8.4.2/rules/lib/builtins/Label); or [path](/versions/8.4.2/rules/lib/builtins/path); default is `''`  Path to the directory where the archive will be unpacked, relative to the repository directory. |
| `sha256` | [string](/versions/8.4.2/rules/lib/core/string); default is `''`  The expected SHA-256 hash of the file downloaded. This must match the SHA-256 hash of the file downloaded. It is a security risk to omit the SHA-256 as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given hash; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. |
| `type` | [string](/versions/8.4.2/rules/lib/core/string); default is `''`  The archive type of the downloaded file. By default, the archive type is determined from the file extension of the URL. If the file has no extension, you can explicitly specify either "zip", "jar", "war", "aar", "nupkg", "whl", "tar", "tar.gz", "tgz", "tar.xz", "txz", ".tar.zst", ".tzst", "tar.bz2", ".tbz", ".ar", or ".deb" here. |
| `strip_prefix` | [string](/versions/8.4.2/rules/lib/core/string); default is `''`  A directory prefix to strip from the extracted files. Many archives contain a top-level directory that contains all files in the archive. Instead of needing to specify this prefix over and over in the `build_file`, this field can be used to strip it from extracted files. For compatibility, this parameter may also be used under the deprecated name `stripPrefix`. |
| `allow_fail` | [bool](/versions/8.4.2/rules/lib/core/bool); default is `False`  If set, indicate the error in the return value instead of raising an error for failed downloads. |
| `canonical_id` | [string](/versions/8.4.2/rules/lib/core/string); default is `''`  If set, restrict cache hits to those cases where the file was added to the cache with the same canonical id. By default caching uses the checksum" (`sha256` or `integrity`). |
| `auth` | [dict](/versions/8.4.2/rules/lib/core/dict); default is `{}`  An optional dict specifying authentication information for some of the URLs. |
| `headers` | [dict](/versions/8.4.2/rules/lib/core/dict); default is `{}`  An optional dict specifying http headers for all URLs. |
| `integrity` | [string](/versions/8.4.2/rules/lib/core/string); default is `''`  Expected checksum of the file downloaded, in Subresource Integrity format. This must match the checksum of the file downloaded. It is a security risk to omit the checksum as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given checksum; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. |
| `rename_files` | [dict](/versions/8.4.2/rules/lib/core/dict); default is `{}`  An optional dict specifying files to rename during the extraction. Archive entries with names exactly matching a key will be renamed to the value, prior to any directory prefix adjustment. This can be used to extract archives that contain non-Unicode filenames, or which have files that would extract to the same path on case-insensitive filesystems. |

## execute

```
exec_result module_ctx.execute(arguments, timeout=600, environment={}, quiet=True, working_directory="")
```

Executes the command given by the list of arguments. The execution time of the command is limited by `timeout` (in seconds, default 600 seconds). This method returns an `exec_result` structure containing the output of the command. The `environment` map can be used to override some environment variables to be passed to the process.

### Parameters

| Parameter | Description |
| --- | --- |
| `arguments` | [sequence](/versions/8.4.2/rules/lib/core/list); required  List of arguments, the first element should be the path to the program to execute. |
| `timeout` | [int](/versions/8.4.2/rules/lib/core/int); default is `600`  Maximum duration of the command in seconds (default is 600 seconds). |
| `environment` | [dict](/versions/8.4.2/rules/lib/core/dict); default is `{}`  Force some environment variables to be set to be passed to the process. The value can be `None` to remove the environment variable. |
| `quiet` | [bool](/versions/8.4.2/rules/lib/core/bool); default is `True`  If stdout and stderr should be printed to the terminal. |
| `working_directory` | [string](/versions/8.4.2/rules/lib/core/string); default is `""`  Working directory for command execution. Can be relative to the repository root or absolute. The default is the repository root. |

## extension\_metadata

```
extension_metadata module_ctx.extension_metadata(root_module_direct_deps=None, root_module_direct_dev_deps=None, reproducible=False)
```

Constructs an opaque object that can be returned from the module extension's implementation function to provide metadata about the repositories generated by the extension to Bazel.

### Parameters

| Parameter | Description |
| --- | --- |
| `root_module_direct_deps` | [sequence](/versions/8.4.2/rules/lib/core/list) of [string](/versions/8.4.2/rules/lib/core/string)s; or [string](/versions/8.4.2/rules/lib/core/string); or `None`; default is `None`  The names of the repositories that the extension considers to be direct dependencies of the root module. If the root module imports additional repositories or does not import all of these repositories via [`use_repo`](/versions/8.4.2/rules/lib/globals/module#use_repo), Bazel will print a warning when the extension is evaluated, instructing the user to run `bazel mod tidy` to fix the `use_repo` calls automatically. If one of `root_module_direct_deps` and will print a warning and a fixup command when the extension is evaluated. If one of `root_module_direct_deps` and `root_module_direct_dev_deps` is specified, the other has to be as well. The lists specified by these two parameters must be disjoint. Exactly one of `root_module_direct_deps` and `root_module_direct_dev_deps` can be set to the special value `"all"`, which is treated as if a list with the names of all repositories generated by the extension was specified as the value. |
| `root_module_direct_dev_deps` | [sequence](/versions/8.4.2/rules/lib/core/list) of [string](/versions/8.4.2/rules/lib/core/string)s; or [string](/versions/8.4.2/rules/lib/core/string); or `None`; default is `None`  The names of the repositories that the extension considers to be direct dev dependencies of the root module. If the root module imports additional repositories or does not import all of these repositories via [`use_repo`](/versions/8.4.2/rules/lib/globals/module#use_repo) on an extension proxy created with `use_extension(..., dev_dependency = True)`, Bazel will print a warning when the extension is evaluated, instructing the user to run `bazel mod tidy` to fix the `use_repo` calls automatically. If one of `root_module_direct_deps` and `root_module_direct_dev_deps` is specified, the other has to be as well. The lists specified by these two parameters must be disjoint. Exactly one of `root_module_direct_deps` and `root_module_direct_dev_deps` can be set to the special value `"all"`, which is treated as if a list with the names of all repositories generated by the extension was specified as the value. |
| `reproducible` | [bool](/versions/8.4.2/rules/lib/core/bool); default is `False`  States that this module extension ensures complete reproducibility, thereby it should not be stored in the lockfile. |

## extract

```
None module_ctx.extract(archive, output='', strip_prefix='', *, rename_files={}, watch_archive='auto')
```

Extract an archive to the repository directory.

### Parameters

| Parameter | Description |
| --- | --- |
| `archive` | [string](/versions/8.4.2/rules/lib/core/string); or [Label](/versions/8.4.2/rules/lib/builtins/Label); or [path](/versions/8.4.2/rules/lib/builtins/path); required  path to the archive that will be unpacked, relative to the repository directory. |
| `output` | [string](/versions/8.4.2/rules/lib/core/string); or [Label](/versions/8.4.2/rules/lib/builtins/Label); or [path](/versions/8.4.2/rules/lib/builtins/path); default is `''`  path to the directory where the archive will be unpacked, relative to the repository directory. |
| `strip_prefix` | [string](/versions/8.4.2/rules/lib/core/string); default is `''`  a directory prefix to strip from the extracted files. Many archives contain a top-level directory that contains all files in the archive. Instead of needing to specify this prefix over and over in the `build_file`, this field can be used to strip it from extracted files. For compatibility, this parameter may also be used under the deprecated name `stripPrefix`. |
| `rename_files` | [dict](/versions/8.4.2/rules/lib/core/dict); default is `{}`  An optional dict specifying files to rename during the extraction. Archive entries with names exactly matching a key will be renamed to the value, prior to any directory prefix adjustment. This can be used to extract archives that contain non-Unicode filenames, or which have files that would extract to the same path on case-insensitive filesystems. |
| `watch_archive` | [string](/versions/8.4.2/rules/lib/core/string); default is `'auto'`  whether to [watch](#watch) the archive file. Can be the string 'yes', 'no', or 'auto'. Passing 'yes' is equivalent to immediately invoking the [`watch()`](#watch) method; passing 'no' does not attempt to watch the file; passing 'auto' will only attempt to watch the file when it is legal to do so (see `watch()` docs for more information. |

## file

```
None module_ctx.file(path, content='', executable=True, legacy_utf8=False)
```

Generates a file in the repository directory with the provided content.

### Parameters

| Parameter | Description |
| --- | --- |
| `path` | [string](/versions/8.4.2/rules/lib/core/string); or [Label](/versions/8.4.2/rules/lib/builtins/Label); or [path](/versions/8.4.2/rules/lib/builtins/path); required  Path of the file to create, relative to the repository directory. |
| `content` | [string](/versions/8.4.2/rules/lib/core/string); default is `''`  The content of the file to create, empty by default. |
| `executable` | [bool](/versions/8.4.2/rules/lib/core/bool); default is `True`  Set the executable flag on the created file, true by default. |
| `legacy_utf8` | [bool](/versions/8.4.2/rules/lib/core/bool); default is `False`  No-op. This parameter is deprecated and will be removed in a future version of Bazel. |

## getenv

```
string module_ctx.getenv(name, default=None)
```

Returns the value of an environment variable `name` as a string if exists, or `default` if it doesn't.

When building incrementally, any change to the value of the variable named by `name` will cause this repository to be re-fetched.

### Parameters

| Parameter | Description |
| --- | --- |
| `name` | [string](/versions/8.4.2/rules/lib/core/string); required  Name of desired environment variable. |
| `default` | [string](/versions/8.4.2/rules/lib/core/string); or `None`; default is `None`  Default value to return if `name` is not found. |

May return `None`.

## is\_dev\_dependency

```
bool module_ctx.is_dev_dependency(tag)
```

Returns whether the given tag was specified on the result of a [use\_extension](/versions/8.4.2/rules/lib/globals/module#use_extension) call with `devDependency = True`.

### Parameters

| Parameter | Description |
| --- | --- |
| `tag` | bazel\_module\_tag; required  A tag obtained from [bazel\_module.tags](/versions/8.4.2/rules/lib/builtins/bazel_module#tags). |

## modules

```
list module_ctx.modules
```

A list of all the Bazel modules in the external dependency graph that use this module extension, each of which is a [bazel\_module](/versions/8.4.2/rules/lib/builtins/bazel_module) object that exposes all the tags it specified for this extension. The iteration order of this dictionary is guaranteed to be the same as breadth-first search starting from the root module.

## os

```
repository_os module_ctx.os
```

A struct to access information from the system.

## path

```
path module_ctx.path(path)
```

Returns a path from a string, label or path. If the path is relative, it will resolve relative to the repository directory. If the path is a label, it will resolve to the path of the corresponding file. Note that remote repositories are executed during the analysis phase and thus cannot depends on a target result (the label should point to a non-generated file). If path is a path, it will return that path as is.

### Parameters

| Parameter | Description |
| --- | --- |
| `path` | [string](/versions/8.4.2/rules/lib/core/string); or [Label](/versions/8.4.2/rules/lib/builtins/Label); or [path](/versions/8.4.2/rules/lib/builtins/path); required  `string`, `Label` or `path` from which to create a path from. |

## read

```
string module_ctx.read(path, *, watch='auto')
```

Reads the content of a file on the filesystem.

### Parameters

| Parameter | Description |
| --- | --- |
| `path` | [string](/versions/8.4.2/rules/lib/core/string); or [Label](/versions/8.4.2/rules/lib/builtins/Label); or [path](/versions/8.4.2/rules/lib/builtins/path); required  Path of the file to read from. |
| `watch` | [string](/versions/8.4.2/rules/lib/core/string); default is `'auto'`  Whether to [watch](#watch) the file. Can be the string 'yes', 'no', or 'auto'. Passing 'yes' is equivalent to immediately invoking the [`watch()`](#watch) method; passing 'no' does not attempt to watch the file; passing 'auto' will only attempt to watch the file when it is legal to do so (see `watch()` docs for more information. |

## report\_progress

```
None module_ctx.report_progress(status='')
```

Updates the progress status for the fetching of this repository or module extension.

### Parameters

| Parameter | Description |
| --- | --- |
| `status` | [string](/versions/8.4.2/rules/lib/core/string); default is `''`  `string` describing the current status of the fetch progress. |

## root\_module\_has\_non\_dev\_dependency

```
bool module_ctx.root_module_has_non_dev_dependency
```

Whether the root module uses this extension as a non-dev dependency.

## watch

```
None module_ctx.watch(path)
```

Tells Bazel to watch for changes to the given path, whether or not it exists, or whether it's a file or a directory. Any changes to the file or directory will invalidate this repository or module extension, and cause it to be refetched or re-evaluated next time.

"Changes" include changes to the contents of the file (if the path is a file); if the path was a file but is now a directory, or vice versa; and if the path starts or stops existing. Notably, this does *not* include changes to any files under the directory if the path is a directory. For that, use [`path.readdir()`](/versions/8.4.2/rules/lib/builtins/path#readdir) instead.

Note that attempting to watch paths inside the repo currently being fetched, or inside the working directory of the current module extension, will result in an error. A module extension attempting to watch a path outside the current Bazel workspace will also result in an error.

### Parameters

| Parameter | Description |
| --- | --- |
| `path` | [string](/versions/8.4.2/rules/lib/core/string); or [Label](/versions/8.4.2/rules/lib/builtins/Label); or [path](/versions/8.4.2/rules/lib/builtins/path); required  Path of the file to watch. |

## which

```
path module_ctx.which(program)
```

Returns the `path` of the corresponding program or `None` if there is no such program in the path.

### Parameters

| Parameter | Description |
| --- | --- |
| `program` | [string](/versions/8.4.2/rules/lib/core/string); required  Program to find in the path. |

May return `None`.