diff --git a/libs/cli/langgraph_cli/uv_lock.py b/libs/cli/langgraph_cli/uv_lock.py index 1e33d16d7..210b116fb 100644 --- a/libs/cli/langgraph_cli/uv_lock.py +++ b/libs/cli/langgraph_cli/uv_lock.py @@ -970,6 +970,18 @@ def python_config_to_docker_uv_lock( f"{uv_export_project_dir}/uv.lock", ) ) + for package in plan.install_order: + relative_pyproject = pathlib.PurePosixPath( + package.pyproject_path.relative_to(plan.project_root).as_posix() + ) + if relative_pyproject == pathlib.PurePosixPath("pyproject.toml"): + continue + docker_plan.add_raw( + copy_from_project_root( + relative_pyproject, + f"{uv_export_project_dir}/{relative_pyproject.as_posix()}", + ) + ) docker_plan.add_instruction("WORKDIR", uv_export_project_dir) docker_plan.add_instruction( "RUN", diff --git a/libs/cli/tests/unit_tests/test_config.py b/libs/cli/tests/unit_tests/test_config.py index c8b24020c..592b63517 100644 --- a/libs/cli/tests/unit_tests/test_config.py +++ b/libs/cli/tests/unit_tests/test_config.py @@ -1403,6 +1403,23 @@ def test_config_to_docker_uv_lock(): "COPY --from=uv-workspace-root uv.lock /tmp/uv_export/project/uv.lock" in docker ) + agent_pyproject_copy = ( + "COPY --from=uv-workspace-root apps/agent/pyproject.toml " + "/tmp/uv_export/project/apps/agent/pyproject.toml" + ) + shared_pyproject_copy = ( + "COPY --from=uv-workspace-root libs/shared/pyproject.toml " + "/tmp/uv_export/project/libs/shared/pyproject.toml" + ) + assert agent_pyproject_copy in docker + assert shared_pyproject_copy in docker + assert ( + "libs/extra/pyproject.toml /tmp/uv_export/project/libs/extra" not in docker + ) + assert docker.index(shared_pyproject_copy) < docker.index(agent_pyproject_copy) + assert docker.index(agent_pyproject_copy) < docker.index( + "WORKDIR /tmp/uv_export/project" + ) assert additional_contexts == {"uv-workspace-root": str(project_root.resolve())} assert (