Skip to content

Empty ephemerals inside commands #2173

Description

@Aphosis

Hello ! We had an issue internally after witching to Rez 3.4.0, where sometimes the ephemerals binding inside commands would be empty.

This was not the case for context.resolved_ephemerals, nor for the created REZ_USED_EPH_RESOLVE and REZ_EPH_<PKG>_REQUEST environment variables.

This does happen (or not) consistently for any given request, but does not happen for every request, if that makes sense.

One of the factors I could determine was if there was another late bound function in the package.

Environment

  • OS: Windows
  • Rez version: 3.4.0
  • Rez python version: Python 3.13.8

To Reproduce

I wrote a small script to reproduce the issue.

The script creates a simple package that accesses ephemerals inside commands and has a late bound function, and marks whether it found a particular ephemeral.

It then resolves a context with this package and the expected ephemeral, and compares what was seen in commands with the actual resolution (the context resolved_ephemerals and environment variables injected by Rez on resolution).

You can run it with rez python ./path/to/script.py.

import tempfile
from pathlib import Path

from rez.resolved_context import ResolvedContext

PACKAGE_PY = """
name = "foo"
version = "1.0"

@late()
def requires():
    return []

def commands():
    if "myeph" in ephemerals:
        env.EPH_SEEN_IN_COMMANDS = "1"
    else:
        env.EPH_SEEN_IN_COMMANDS = "0"
"""


def main():
    with tempfile.TemporaryDirectory(prefix="repro_case_empty_ephemerals_") as temp:
        package_repository = Path(temp)

        package_definition = package_repository / "foo" / "1.0" / "package.py"

        package_definition.parent.mkdir(parents=True, exist_ok=True)
        package_definition.write_text(PACKAGE_PY)

        context = ResolvedContext(
            ["foo", ".myeph-1"], package_paths=[str(package_repository)]
        )
        environ = context.get_environ()

        from_context = context.resolved_ephemerals
        from_env = environ.get("REZ_USED_EPH_RESOLVE")
        seen_in_commands = environ.get("EPH_SEEN_IN_COMMANDS")

        print(f"Ephemerals from `context.resolved_ephemerals`: {from_context}")
        print(f"Ephemerals from `REZ_USED_EPH_RESOLVE`: {from_env}")
        print(f"Ephemeral seen in `commands`: {seen_in_commands}")

        did_resolve = bool(from_context) and bool(from_env)

        if did_resolve and seen_in_commands != "1":
            print(
                "Ephemeral was resolved but absent from `ephemerals` inside `commands`"
            )


if __name__ == "__main__":
    main()

Expected behavior

An ephemerals binding matching context.resolved_ephemerals and the associated environment variables.

Actual behavior

Empty ephemerals binding.

Related Issues/PRs

Regression

The bug only affects the ephemerals binding, and is seemingly caused by the recent change introduced in #2117.

Internally, we found a few possible workarounds (such as using context.resolved_ephemerals in a late bound arbitrary attribute), and are working on a fix. It will probably be a patch to rez.resolved_context.ResolvedContext._get_pre_resolve_bindings that avoids caching ephemerals with other bindings, as ephemerals can be filled during the resolution.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugpackage-definitionRelated to package definition files/schema

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions