Skip to content

Instantly share code, notes, and snippets.

@jaseemabid
Last active August 12, 2025 12:54
Show Gist options
  • Save jaseemabid/e2acd88b8ccb59e5d60b591247a4655c to your computer and use it in GitHub Desktop.
Save jaseemabid/e2acd88b8ccb59e5d60b591247a4655c to your computer and use it in GitHub Desktop.
UV Package version bug repro
# Python-generated files
__pycache__/
*.py[oc]
build/
dist/
wheels/
*.egg-info
# Virtual environments
.venv

uv sync --frozen --no-dev incorrectly removes runtime dependencies

Bug Description

uv sync --frozen --no-dev removes runtime dependencies (types-boto3-ecr) even though they are required in the lock file.

Reproduction

The full project is here in a gist, but this is what I did to get there:

https://gist.github.com/jaseemabid/e2acd88b8ccb59e5d60b591247a4655c

This is a fairly tiny project with 2 runtime and 1 dev dependency.

❯ uv init
❯ uv add "boto3>=1.40"
❯ uv add "types-boto3-ecr>=1.40"

❯ uv add --dev "types-boto3[full]==1.40"
❯ uv sync

The full lockfile is included in the gist.

Expected vs Actual

I expected this to work fine, since the package is explicitly requested:

❯ uv run --no-dev python -c 'import types_boto3_ecr'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
    import types_boto3_ecr
ModuleNotFoundError: No module named 'types_boto3_ecr'

This only works without the --no-dev flag, but I can't tell why.

❯ uv run python -c 'import types_boto3_ecr'

Expected: types-boto3-ecr should be available (it's a runtime dependency) Actual: ModuleNotFoundError - package is missing despite being in runtime dependencies

This is pretty concerning that a package I have explicitly mentioned in project.toml which UV also added to uv.lock isn't in the final virtual env.

I had runtime crashes because of this issue and it's kinda bad.

Environment

  • uv 0.8.6 (Homebrew 2025-08-07)
  • Python 3.13.6
  • Reproduced on macOS and Docker Linux
def main():
print("Hello from uv-package-test!")
if __name__ == "__main__":
main()
[project]
name = "uv-package-test"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
"boto3>=1.40",
"types-boto3-ecr>=1.40",
]
[dependency-groups]
dev = [
"types-boto3[full]==1.40",
]
version = 1
revision = 3
requires-python = ">=3.13"
[[package]]
name = "boto3"
version = "1.40.7"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "botocore" },
{ name = "jmespath" },
{ name = "s3transfer" },
]
sdist = { url = "https://files.pythonhosted.org/packages/58/5a/f31556d817e872c2723196a34b197d971d78297b22b8bae0ae6d93f7f9c1/boto3-1.40.7.tar.gz", hash = "sha256:61b15f70761f1eadd721c6ba41a92658f003eaaef09500ca7642f5ae68ec8945", size = 111989, upload-time = "2025-08-11T19:20:45.824Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/41/e3/f2a77f4809ffe4e896c2e6186db88333ae980f52a91b28e9fd068d8f5506/boto3-1.40.7-py3-none-any.whl", hash = "sha256:8727cac601a679d2885dc78b8119a0548bbbe04e49b72f7d94021a629154c080", size = 140061, upload-time = "2025-08-11T19:20:43.173Z" },
]
[[package]]
name = "botocore"
version = "1.40.7"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "jmespath" },
{ name = "python-dateutil" },
{ name = "urllib3" },
]
sdist = { url = "https://files.pythonhosted.org/packages/73/d7/5e559918410b259c1e54a4646ff39c56433e1c9cefa5e66ab0f06716cee8/botocore-1.40.7.tar.gz", hash = "sha256:33793696680cf3a0c4b5ace4f9070c67c4d4fcb19c999fd85cfee55de3dcf913", size = 14318282, upload-time = "2025-08-11T19:20:33.348Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/b1/fa/bb7ec68b24d1b4678d341a305cbfed78a593e6383c86a70727410e4d0e11/botocore-1.40.7-py3-none-any.whl", hash = "sha256:a06956f3d7222e80ef6ae193608f358c3b7898e1a2b88553479d8f9737fbb03e", size = 13981488, upload-time = "2025-08-11T19:20:27.303Z" },
]
[[package]]
name = "botocore-stubs"
version = "1.38.46"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "types-awscrt" },
]
sdist = { url = "https://files.pythonhosted.org/packages/05/45/27cabc7c3022dcb12de5098cc646b374065f5e72fae13600ff1756f365ee/botocore_stubs-1.38.46.tar.gz", hash = "sha256:a04e69766ab8bae338911c1897492f88d05cd489cd75f06e6eb4f135f9da8c7b", size = 42299, upload-time = "2025-06-29T22:58:24.765Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/cc/84/06490071e26bab22ac79a684e98445df118adcf80c58c33ba5af184030f2/botocore_stubs-1.38.46-py3-none-any.whl", hash = "sha256:cc21d9a7dd994bdd90872db4664d817c4719b51cda8004fd507a4bf65b085a75", size = 66083, upload-time = "2025-06-29T22:58:22.234Z" },
]
[[package]]
name = "jmespath"
version = "1.0.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/00/2a/e867e8531cf3e36b41201936b7fa7ba7b5702dbef42922193f05c8976cd6/jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe", size = 25843, upload-time = "2022-06-17T18:00:12.224Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256, upload-time = "2022-06-17T18:00:10.251Z" },
]
[[package]]
name = "python-dateutil"
version = "2.9.0.post0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "six" },
]
sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
]
[[package]]
name = "s3transfer"
version = "0.13.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "botocore" },
]
sdist = { url = "https://files.pythonhosted.org/packages/6d/05/d52bf1e65044b4e5e27d4e63e8d1579dbdec54fce685908ae09bc3720030/s3transfer-0.13.1.tar.gz", hash = "sha256:c3fdba22ba1bd367922f27ec8032d6a1cf5f10c934fb5d68cf60fd5a23d936cf", size = 150589, upload-time = "2025-07-18T19:22:42.31Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/6d/4f/d073e09df851cfa251ef7840007d04db3293a0482ce607d2b993926089be/s3transfer-0.13.1-py3-none-any.whl", hash = "sha256:a981aa7429be23fe6dfc13e80e4020057cbab622b08c0315288758d67cabc724", size = 85308, upload-time = "2025-07-18T19:22:40.947Z" },
]
[[package]]
name = "six"
version = "1.17.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
]
[[package]]
name = "types-awscrt"
version = "0.27.5"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/09/dd/9dc12092b88b95b88ef161c856619c1ef1f52bec1248273abe43ba56f123/types_awscrt-0.27.5.tar.gz", hash = "sha256:8eefe50d1709520663b77d3643a772c35ace3d8acfcb296f857627622c84cb4c", size = 16953, upload-time = "2025-07-31T02:03:20.284Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/83/fc/259979fadf4c6b0ff8a025d61a7d47e2868b4e9e429983c3ee58fdc9d106/types_awscrt-0.27.5-py3-none-any.whl", hash = "sha256:99ee40e787dfb92ae93a5c956251a03b847de3ac532552f7e06dd5eb6e0fd02f", size = 39627, upload-time = "2025-07-31T02:03:19.168Z" },
]
[[package]]
name = "types-boto3"
version = "1.40.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "botocore-stubs" },
{ name = "types-s3transfer" },
]
sdist = { url = "https://files.pythonhosted.org/packages/5c/5f/fc210668a0e9a685ded77fc94554220a83ba0be15e999f66b8424bda21ed/types_boto3-1.40.0.tar.gz", hash = "sha256:c7659a36da5ae397a7a38513ddf8295426aa8588140935be15c4fd2b49758e4f", size = 101040, upload-time = "2025-07-31T19:58:12.656Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/20/04/631f058d0835d503e30d450c28ca84b0a7612eae891a288f56122405c96d/types_boto3-1.40.0-py3-none-any.whl", hash = "sha256:8b75c3b4dfeaa54b530a7950cc828131d5d16898463877c4306f2384bb57f534", size = 69479, upload-time = "2025-07-31T19:58:07.111Z" },
]
[package.optional-dependencies]
full = [
{ name = "types-boto3-full" },
]
[[package]]
name = "types-boto3-ecr"
version = "1.40.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/e7/11/4366f0abde379948cc3f542c5dadb7caf21610a43fcaccce7fa90fe38167/types_boto3_ecr-1.40.0.tar.gz", hash = "sha256:54821955ce0d0626ae20ec8be91102dd0c1fed8aee27ccb3d2a8926d60ef78b9", size = 34467, upload-time = "2025-07-31T19:40:02.26Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ea/b0/fb2e3823b462cc8e27131bcadafb2ab44d3a27817a0e019fca8a6dc33583/types_boto3_ecr-1.40.0-py3-none-any.whl", hash = "sha256:7469b2033982c744370679d16ebf9c04ce040f8cde2d406149295df29bc44572", size = 40192, upload-time = "2025-07-31T19:40:00.942Z" },
]
[[package]]
name = "types-boto3-full"
version = "1.40.7"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/2e/13/f3021dcc67b0e8b1229f1728934b926d6c71034e4c82c740c9e537f012e5/types_boto3_full-1.40.7.tar.gz", hash = "sha256:a775583f6af49e8e2899ed1699d4562f9ceb01d2cd647a292def898ce7a896bb", size = 8080166, upload-time = "2025-08-12T01:09:47.076Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ed/83/467e3457cc5a378ab7ed4c7d0386f56350c7c3c211535a1dbab95f4a3c1b/types_boto3_full-1.40.7-py3-none-any.whl", hash = "sha256:bb616d62be70a5ff122712e0b51dae7f425f7d1bf32b3eb51b7e4e1e3bc0a168", size = 12456543, upload-time = "2025-08-12T01:09:43.785Z" },
]
[[package]]
name = "types-s3transfer"
version = "0.13.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/42/c1/45038f259d6741c252801044e184fec4dbaeff939a58f6160d7c32bf4975/types_s3transfer-0.13.0.tar.gz", hash = "sha256:203dadcb9865c2f68fb44bc0440e1dc05b79197ba4a641c0976c26c9af75ef52", size = 14175, upload-time = "2025-05-28T02:16:07.614Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c8/5d/6bbe4bf6a79fb727945291aef88b5ecbdba857a603f1bbcf1a6be0d3f442/types_s3transfer-0.13.0-py3-none-any.whl", hash = "sha256:79c8375cbf48a64bff7654c02df1ec4b20d74f8c5672fc13e382f593ca5565b3", size = 19588, upload-time = "2025-05-28T02:16:06.709Z" },
]
[[package]]
name = "urllib3"
version = "2.5.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" },
]
[[package]]
name = "uv-package-test"
version = "0.1.0"
source = { virtual = "." }
dependencies = [
{ name = "boto3" },
{ name = "types-boto3-ecr" },
]
[package.dev-dependencies]
dev = [
{ name = "types-boto3", extra = ["full"] },
]
[package.metadata]
requires-dist = [
{ name = "boto3", specifier = ">=1.40" },
{ name = "types-boto3-ecr", specifier = ">=1.40" },
]
[package.metadata.requires-dev]
dev = [{ name = "types-boto3", extras = ["full"], specifier = "==1.40" }]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment