chore(pip_parse, gazelle): generate/use hub repo aliases by default (#1525)

This makes `pip_parse.incompatible_generate_aliases = True` the default.
This only affects
workspace builds; it is already the default for bzlmod.

Summary:
- Enable the generation of aliases in `pip_repository`.
- Flip usage of aliases in `gazelle`.
- Remove usage of the old flags from the example code.
- Update the `gazelle` manifest generator to leave the
  `gazelle_python.yaml` manifest unchanged for people who have
  `use_pip_repository_aliases = True` in their `BUILD.bazel` files.
  Once they remove the flag, the `gazelle_python.yaml` will be updated.
- Update `multi_pip_parse` to handle sub-hub repositories where
  the `all_requirements` returns aliased targets.

Fixes #1498
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2f593b0..02aca34 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -25,12 +25,24 @@
   as all of the publicly available symbols (etc. `package_annotation`) are
   re-exported via `//python:pip_bzl` `bzl_library`.
 
-* Gazelle Python extension no longer has runtime dependencies. Using
+* (gazelle) Gazelle Python extension no longer has runtime dependencies. Using
   `GAZELLE_PYTHON_RUNTIME_DEPS` from `@rules_python_gazelle_plugin//:def.bzl` is
   no longer necessary.
 
-* The installation of `pip_parse` repository rule toolchain dependencies is now
-  done as part of `py_repositories` call.
+* (pip_parse) The installation of `pip_parse` repository rule toolchain
+  dependencies is now done as part of `py_repositories` call.
+
+* (pip_parse) The flag `incompatible_generate_aliases` has been flipped to
+  `True` by default on `non-bzlmod` setups allowing users to use the same label
+  strings during the transition period. For example, instead of
+  `@pypi_foo//:pkg`, you can now use `@pypi//foo` or `@pypi//foo:pkg`. Other
+  labels that are present in the `foo` package are `dist_info`, `whl` and
+  `data`. Note, that the `@pypi_foo//:pkg` labels are still present for
+  backwards compatibility.
+
+* (gazelle) The flag `use_pip_repository_aliases` is now set to `True` by
+  default, which will cause `gazelle` to change third-party dependency labels
+  from `@pip_foo//:pkg` to `@pip//foo` by default.
 
 Breaking changes:
 
diff --git a/examples/build_file_generation/BUILD.bazel b/examples/build_file_generation/BUILD.bazel
index a03af54..5b01215 100644
--- a/examples/build_file_generation/BUILD.bazel
+++ b/examples/build_file_generation/BUILD.bazel
@@ -43,9 +43,6 @@
     # NOTE: We can pass a list just like in `bzlmod_build_file_generation` example
     # but we keep a single target here for regression testing.
     requirements = "//:requirements_lock.txt",
-    # NOTE: we can use this flag in order to make our setup compatible with
-    # bzlmod.
-    use_pip_repository_aliases = True,
 )
 
 # Our gazelle target points to the python gazelle binary.
diff --git a/examples/build_file_generation/WORKSPACE b/examples/build_file_generation/WORKSPACE
index a743644..c656d5b 100644
--- a/examples/build_file_generation/WORKSPACE
+++ b/examples/build_file_generation/WORKSPACE
@@ -94,8 +94,6 @@
 # You can instead check this `requirements.bzl` file into your repo.
 pip_parse(
     name = "pip",
-    # Generate user friendly alias labels for each dependency that we have.
-    incompatible_generate_aliases = True,
     # (Optional) You can provide a python_interpreter (path) or a python_interpreter_target (a Bazel target, that
     # acts as an executable). The latter can be anything that could be used as Python interpreter. E.g.:
     # 1. Python interpreter that you compile in the build file.
diff --git a/examples/build_file_generation/gazelle_python.yaml b/examples/build_file_generation/gazelle_python.yaml
index 1000757..b3757a3 100644
--- a/examples/build_file_generation/gazelle_python.yaml
+++ b/examples/build_file_generation/gazelle_python.yaml
@@ -114,5 +114,4 @@
     zipp.py310compat: zipp
   pip_repository:
     name: pip
-    use_pip_repository_aliases: true
-integrity: 030d6d99b56c32d6577e616b617260d0a93588af791269162e43391a5a4fa576
+integrity: a88d99bf5ea018bdb052ccda8ea5c98b6bae81312a338f909532285b76026fe1
diff --git a/examples/bzlmod/gazelle_python.yaml b/examples/bzlmod/gazelle_python.yaml
deleted file mode 100644
index 12096e5..0000000
--- a/examples/bzlmod/gazelle_python.yaml
+++ /dev/null
@@ -1,590 +0,0 @@
-# GENERATED FILE - DO NOT EDIT!
-#
-# To update this file, run:
-#   bazel run //:gazelle_python_manifest.update
-
-manifest:
-  modules_mapping:
-    S3: s3cmd
-    S3.ACL: s3cmd
-    S3.AccessLog: s3cmd
-    S3.BidirMap: s3cmd
-    S3.CloudFront: s3cmd
-    S3.Config: s3cmd
-    S3.ConnMan: s3cmd
-    S3.Crypto: s3cmd
-    S3.Custom_httplib27: s3cmd
-    S3.Custom_httplib3x: s3cmd
-    S3.Exceptions: s3cmd
-    S3.ExitCodes: s3cmd
-    S3.FileDict: s3cmd
-    S3.FileLists: s3cmd
-    S3.HashCache: s3cmd
-    S3.MultiPart: s3cmd
-    S3.PkgInfo: s3cmd
-    S3.Progress: s3cmd
-    S3.S3: s3cmd
-    S3.S3Uri: s3cmd
-    S3.SortedDict: s3cmd
-    S3.Utils: s3cmd
-    astroid: astroid
-    astroid.arguments: astroid
-    astroid.astroid_manager: astroid
-    astroid.bases: astroid
-    astroid.brain: astroid
-    astroid.brain.brain_argparse: astroid
-    astroid.brain.brain_attrs: astroid
-    astroid.brain.brain_boto3: astroid
-    astroid.brain.brain_builtin_inference: astroid
-    astroid.brain.brain_collections: astroid
-    astroid.brain.brain_crypt: astroid
-    astroid.brain.brain_ctypes: astroid
-    astroid.brain.brain_curses: astroid
-    astroid.brain.brain_dataclasses: astroid
-    astroid.brain.brain_dateutil: astroid
-    astroid.brain.brain_fstrings: astroid
-    astroid.brain.brain_functools: astroid
-    astroid.brain.brain_gi: astroid
-    astroid.brain.brain_hashlib: astroid
-    astroid.brain.brain_http: astroid
-    astroid.brain.brain_hypothesis: astroid
-    astroid.brain.brain_io: astroid
-    astroid.brain.brain_mechanize: astroid
-    astroid.brain.brain_multiprocessing: astroid
-    astroid.brain.brain_namedtuple_enum: astroid
-    astroid.brain.brain_nose: astroid
-    astroid.brain.brain_numpy_core_einsumfunc: astroid
-    astroid.brain.brain_numpy_core_fromnumeric: astroid
-    astroid.brain.brain_numpy_core_function_base: astroid
-    astroid.brain.brain_numpy_core_multiarray: astroid
-    astroid.brain.brain_numpy_core_numeric: astroid
-    astroid.brain.brain_numpy_core_numerictypes: astroid
-    astroid.brain.brain_numpy_core_umath: astroid
-    astroid.brain.brain_numpy_ma: astroid
-    astroid.brain.brain_numpy_ndarray: astroid
-    astroid.brain.brain_numpy_random_mtrand: astroid
-    astroid.brain.brain_numpy_utils: astroid
-    astroid.brain.brain_pathlib: astroid
-    astroid.brain.brain_pkg_resources: astroid
-    astroid.brain.brain_pytest: astroid
-    astroid.brain.brain_qt: astroid
-    astroid.brain.brain_random: astroid
-    astroid.brain.brain_re: astroid
-    astroid.brain.brain_responses: astroid
-    astroid.brain.brain_scipy_signal: astroid
-    astroid.brain.brain_signal: astroid
-    astroid.brain.brain_six: astroid
-    astroid.brain.brain_sqlalchemy: astroid
-    astroid.brain.brain_ssl: astroid
-    astroid.brain.brain_subprocess: astroid
-    astroid.brain.brain_threading: astroid
-    astroid.brain.brain_type: astroid
-    astroid.brain.brain_typing: astroid
-    astroid.brain.brain_unittest: astroid
-    astroid.brain.brain_uuid: astroid
-    astroid.brain.helpers: astroid
-    astroid.builder: astroid
-    astroid.const: astroid
-    astroid.context: astroid
-    astroid.decorators: astroid
-    astroid.exceptions: astroid
-    astroid.filter_statements: astroid
-    astroid.helpers: astroid
-    astroid.inference: astroid
-    astroid.inference_tip: astroid
-    astroid.interpreter: astroid
-    astroid.interpreter.dunder_lookup: astroid
-    astroid.interpreter.objectmodel: astroid
-    astroid.manager: astroid
-    astroid.mixins: astroid
-    astroid.modutils: astroid
-    astroid.node_classes: astroid
-    astroid.nodes: astroid
-    astroid.nodes.as_string: astroid
-    astroid.nodes.const: astroid
-    astroid.nodes.node_classes: astroid
-    astroid.nodes.node_ng: astroid
-    astroid.nodes.scoped_nodes: astroid
-    astroid.nodes.scoped_nodes.mixin: astroid
-    astroid.nodes.scoped_nodes.scoped_nodes: astroid
-    astroid.nodes.scoped_nodes.utils: astroid
-    astroid.nodes.utils: astroid
-    astroid.objects: astroid
-    astroid.protocols: astroid
-    astroid.raw_building: astroid
-    astroid.rebuilder: astroid
-    astroid.scoped_nodes: astroid
-    astroid.test_utils: astroid
-    astroid.transforms: astroid
-    astroid.typing: astroid
-    astroid.util: astroid
-    certifi: certifi
-    certifi.core: certifi
-    chardet: chardet
-    chardet.big5freq: chardet
-    chardet.big5prober: chardet
-    chardet.chardistribution: chardet
-    chardet.charsetgroupprober: chardet
-    chardet.charsetprober: chardet
-    chardet.cli: chardet
-    chardet.cli.chardetect: chardet
-    chardet.codingstatemachine: chardet
-    chardet.compat: chardet
-    chardet.cp949prober: chardet
-    chardet.enums: chardet
-    chardet.escprober: chardet
-    chardet.escsm: chardet
-    chardet.eucjpprober: chardet
-    chardet.euckrfreq: chardet
-    chardet.euckrprober: chardet
-    chardet.euctwfreq: chardet
-    chardet.euctwprober: chardet
-    chardet.gb2312freq: chardet
-    chardet.gb2312prober: chardet
-    chardet.hebrewprober: chardet
-    chardet.jisfreq: chardet
-    chardet.jpcntx: chardet
-    chardet.langbulgarianmodel: chardet
-    chardet.langgreekmodel: chardet
-    chardet.langhebrewmodel: chardet
-    chardet.langhungarianmodel: chardet
-    chardet.langrussianmodel: chardet
-    chardet.langthaimodel: chardet
-    chardet.langturkishmodel: chardet
-    chardet.latin1prober: chardet
-    chardet.mbcharsetprober: chardet
-    chardet.mbcsgroupprober: chardet
-    chardet.mbcssm: chardet
-    chardet.metadata: chardet
-    chardet.metadata.languages: chardet
-    chardet.sbcharsetprober: chardet
-    chardet.sbcsgroupprober: chardet
-    chardet.sjisprober: chardet
-    chardet.universaldetector: chardet
-    chardet.utf8prober: chardet
-    chardet.version: chardet
-    dateutil: python_dateutil
-    dateutil.easter: python_dateutil
-    dateutil.parser: python_dateutil
-    dateutil.parser.isoparser: python_dateutil
-    dateutil.relativedelta: python_dateutil
-    dateutil.rrule: python_dateutil
-    dateutil.tz: python_dateutil
-    dateutil.tz.tz: python_dateutil
-    dateutil.tz.win: python_dateutil
-    dateutil.tzwin: python_dateutil
-    dateutil.utils: python_dateutil
-    dateutil.zoneinfo: python_dateutil
-    dateutil.zoneinfo.rebuild: python_dateutil
-    dill: dill
-    dill.detect: dill
-    dill.logger: dill
-    dill.objtypes: dill
-    dill.pointers: dill
-    dill.session: dill
-    dill.settings: dill
-    dill.source: dill
-    dill.temp: dill
-    idna: idna
-    idna.codec: idna
-    idna.compat: idna
-    idna.core: idna
-    idna.idnadata: idna
-    idna.intranges: idna
-    idna.package_data: idna
-    idna.uts46data: idna
-    isort: isort
-    isort.api: isort
-    isort.comments: isort
-    isort.core: isort
-    isort.deprecated: isort
-    isort.deprecated.finders: isort
-    isort.exceptions: isort
-    isort.files: isort
-    isort.format: isort
-    isort.hooks: isort
-    isort.identify: isort
-    isort.io: isort
-    isort.literal: isort
-    isort.logo: isort
-    isort.main: isort
-    isort.output: isort
-    isort.parse: isort
-    isort.place: isort
-    isort.profiles: isort
-    isort.pylama_isort: isort
-    isort.sections: isort
-    isort.settings: isort
-    isort.setuptools_commands: isort
-    isort.sorting: isort
-    isort.stdlibs: isort
-    isort.stdlibs.all: isort
-    isort.stdlibs.py2: isort
-    isort.stdlibs.py27: isort
-    isort.stdlibs.py3: isort
-    isort.stdlibs.py310: isort
-    isort.stdlibs.py311: isort
-    isort.stdlibs.py36: isort
-    isort.stdlibs.py37: isort
-    isort.stdlibs.py38: isort
-    isort.stdlibs.py39: isort
-    isort.utils: isort
-    isort.wrap: isort
-    isort.wrap_modes: isort
-    lazy_object_proxy: lazy_object_proxy
-    lazy_object_proxy.compat: lazy_object_proxy
-    lazy_object_proxy.simple: lazy_object_proxy
-    lazy_object_proxy.slots: lazy_object_proxy
-    lazy_object_proxy.utils: lazy_object_proxy
-    magic: python_magic
-    magic.compat: python_magic
-    magic.loader: python_magic
-    mccabe: mccabe
-    pathspec: pathspec
-    pathspec.gitignore: pathspec
-    pathspec.pathspec: pathspec
-    pathspec.pattern: pathspec
-    pathspec.patterns: pathspec
-    pathspec.patterns.gitwildmatch: pathspec
-    pathspec.util: pathspec
-    pkg_resources: setuptools
-    pkg_resources.extern: setuptools
-    platformdirs: platformdirs
-    platformdirs.android: platformdirs
-    platformdirs.api: platformdirs
-    platformdirs.macos: platformdirs
-    platformdirs.unix: platformdirs
-    platformdirs.version: platformdirs
-    platformdirs.windows: platformdirs
-    pylint: pylint
-    pylint.checkers: pylint
-    pylint.checkers.async: pylint
-    pylint.checkers.base: pylint
-    pylint.checkers.base.basic_checker: pylint
-    pylint.checkers.base.basic_error_checker: pylint
-    pylint.checkers.base.comparison_checker: pylint
-    pylint.checkers.base.docstring_checker: pylint
-    pylint.checkers.base.name_checker: pylint
-    pylint.checkers.base.name_checker.checker: pylint
-    pylint.checkers.base.name_checker.naming_style: pylint
-    pylint.checkers.base.pass_checker: pylint
-    pylint.checkers.base_checker: pylint
-    pylint.checkers.classes: pylint
-    pylint.checkers.classes.class_checker: pylint
-    pylint.checkers.classes.special_methods_checker: pylint
-    pylint.checkers.deprecated: pylint
-    pylint.checkers.design_analysis: pylint
-    pylint.checkers.dunder_methods: pylint
-    pylint.checkers.ellipsis_checker: pylint
-    pylint.checkers.exceptions: pylint
-    pylint.checkers.format: pylint
-    pylint.checkers.imports: pylint
-    pylint.checkers.lambda_expressions: pylint
-    pylint.checkers.logging: pylint
-    pylint.checkers.mapreduce_checker: pylint
-    pylint.checkers.method_args: pylint
-    pylint.checkers.misc: pylint
-    pylint.checkers.modified_iterating_checker: pylint
-    pylint.checkers.newstyle: pylint
-    pylint.checkers.non_ascii_names: pylint
-    pylint.checkers.raw_metrics: pylint
-    pylint.checkers.refactoring: pylint
-    pylint.checkers.refactoring.implicit_booleaness_checker: pylint
-    pylint.checkers.refactoring.not_checker: pylint
-    pylint.checkers.refactoring.recommendation_checker: pylint
-    pylint.checkers.refactoring.refactoring_checker: pylint
-    pylint.checkers.similar: pylint
-    pylint.checkers.spelling: pylint
-    pylint.checkers.stdlib: pylint
-    pylint.checkers.strings: pylint
-    pylint.checkers.threading_checker: pylint
-    pylint.checkers.typecheck: pylint
-    pylint.checkers.unicode: pylint
-    pylint.checkers.unsupported_version: pylint
-    pylint.checkers.utils: pylint
-    pylint.checkers.variables: pylint
-    pylint.config: pylint
-    pylint.config.argument: pylint
-    pylint.config.arguments_manager: pylint
-    pylint.config.arguments_provider: pylint
-    pylint.config.callback_actions: pylint
-    pylint.config.config_file_parser: pylint
-    pylint.config.config_initialization: pylint
-    pylint.config.configuration_mixin: pylint
-    pylint.config.deprecation_actions: pylint
-    pylint.config.environment_variable: pylint
-    pylint.config.exceptions: pylint
-    pylint.config.find_default_config_files: pylint
-    pylint.config.help_formatter: pylint
-    pylint.config.option: pylint
-    pylint.config.option_manager_mixin: pylint
-    pylint.config.option_parser: pylint
-    pylint.config.options_provider_mixin: pylint
-    pylint.config.utils: pylint
-    pylint.constants: pylint
-    pylint.epylint: pylint
-    pylint.exceptions: pylint
-    pylint.extensions: pylint
-    pylint.extensions.bad_builtin: pylint
-    pylint.extensions.broad_try_clause: pylint
-    pylint.extensions.check_elif: pylint
-    pylint.extensions.code_style: pylint
-    pylint.extensions.comparetozero: pylint
-    pylint.extensions.comparison_placement: pylint
-    pylint.extensions.confusing_elif: pylint
-    pylint.extensions.consider_ternary_expression: pylint
-    pylint.extensions.docparams: pylint
-    pylint.extensions.docstyle: pylint
-    pylint.extensions.empty_comment: pylint
-    pylint.extensions.emptystring: pylint
-    pylint.extensions.eq_without_hash: pylint
-    pylint.extensions.for_any_all: pylint
-    pylint.extensions.mccabe: pylint
-    pylint.extensions.no_self_use: pylint
-    pylint.extensions.overlapping_exceptions: pylint
-    pylint.extensions.private_import: pylint
-    pylint.extensions.redefined_loop_name: pylint
-    pylint.extensions.redefined_variable_type: pylint
-    pylint.extensions.set_membership: pylint
-    pylint.extensions.typing: pylint
-    pylint.extensions.while_used: pylint
-    pylint.graph: pylint
-    pylint.interfaces: pylint
-    pylint.lint: pylint
-    pylint.lint.base_options: pylint
-    pylint.lint.caching: pylint
-    pylint.lint.expand_modules: pylint
-    pylint.lint.message_state_handler: pylint
-    pylint.lint.parallel: pylint
-    pylint.lint.pylinter: pylint
-    pylint.lint.report_functions: pylint
-    pylint.lint.run: pylint
-    pylint.lint.utils: pylint
-    pylint.message: pylint
-    pylint.message.message: pylint
-    pylint.message.message_definition: pylint
-    pylint.message.message_definition_store: pylint
-    pylint.message.message_id_store: pylint
-    pylint.pyreverse: pylint
-    pylint.pyreverse.diadefslib: pylint
-    pylint.pyreverse.diagrams: pylint
-    pylint.pyreverse.dot_printer: pylint
-    pylint.pyreverse.inspector: pylint
-    pylint.pyreverse.main: pylint
-    pylint.pyreverse.mermaidjs_printer: pylint
-    pylint.pyreverse.plantuml_printer: pylint
-    pylint.pyreverse.printer: pylint
-    pylint.pyreverse.printer_factory: pylint
-    pylint.pyreverse.utils: pylint
-    pylint.pyreverse.vcg_printer: pylint
-    pylint.pyreverse.writer: pylint
-    pylint.reporters: pylint
-    pylint.reporters.base_reporter: pylint
-    pylint.reporters.collecting_reporter: pylint
-    pylint.reporters.json_reporter: pylint
-    pylint.reporters.multi_reporter: pylint
-    pylint.reporters.reports_handler_mix_in: pylint
-    pylint.reporters.text: pylint
-    pylint.reporters.ureports: pylint
-    pylint.reporters.ureports.base_writer: pylint
-    pylint.reporters.ureports.nodes: pylint
-    pylint.reporters.ureports.text_writer: pylint
-    pylint.testutils: pylint
-    pylint.testutils.checker_test_case: pylint
-    pylint.testutils.configuration_test: pylint
-    pylint.testutils.constants: pylint
-    pylint.testutils.decorator: pylint
-    pylint.testutils.functional: pylint
-    pylint.testutils.functional.find_functional_tests: pylint
-    pylint.testutils.functional.lint_module_output_update: pylint
-    pylint.testutils.functional.test_file: pylint
-    pylint.testutils.functional_test_file: pylint
-    pylint.testutils.get_test_info: pylint
-    pylint.testutils.global_test_linter: pylint
-    pylint.testutils.lint_module_test: pylint
-    pylint.testutils.output_line: pylint
-    pylint.testutils.pyreverse: pylint
-    pylint.testutils.reporter_for_tests: pylint
-    pylint.testutils.tokenize_str: pylint
-    pylint.testutils.unittest_linter: pylint
-    pylint.testutils.utils: pylint
-    pylint.typing: pylint
-    pylint.utils: pylint
-    pylint.utils.ast_walker: pylint
-    pylint.utils.docs: pylint
-    pylint.utils.file_state: pylint
-    pylint.utils.linterstats: pylint
-    pylint.utils.pragma_parser: pylint
-    pylint.utils.utils: pylint
-    requests: requests
-    requests.adapters: requests
-    requests.api: requests
-    requests.auth: requests
-    requests.certs: requests
-    requests.compat: requests
-    requests.cookies: requests
-    requests.exceptions: requests
-    requests.help: requests
-    requests.hooks: requests
-    requests.models: requests
-    requests.packages: requests
-    requests.sessions: requests
-    requests.status_codes: requests
-    requests.structures: requests
-    requests.utils: requests
-    setuptools: setuptools
-    setuptools.archive_util: setuptools
-    setuptools.build_meta: setuptools
-    setuptools.command: setuptools
-    setuptools.command.alias: setuptools
-    setuptools.command.bdist_egg: setuptools
-    setuptools.command.bdist_rpm: setuptools
-    setuptools.command.build: setuptools
-    setuptools.command.build_clib: setuptools
-    setuptools.command.build_ext: setuptools
-    setuptools.command.build_py: setuptools
-    setuptools.command.develop: setuptools
-    setuptools.command.dist_info: setuptools
-    setuptools.command.easy_install: setuptools
-    setuptools.command.editable_wheel: setuptools
-    setuptools.command.egg_info: setuptools
-    setuptools.command.install: setuptools
-    setuptools.command.install_egg_info: setuptools
-    setuptools.command.install_lib: setuptools
-    setuptools.command.install_scripts: setuptools
-    setuptools.command.py36compat: setuptools
-    setuptools.command.register: setuptools
-    setuptools.command.rotate: setuptools
-    setuptools.command.saveopts: setuptools
-    setuptools.command.sdist: setuptools
-    setuptools.command.setopt: setuptools
-    setuptools.command.test: setuptools
-    setuptools.command.upload: setuptools
-    setuptools.command.upload_docs: setuptools
-    setuptools.config: setuptools
-    setuptools.config.expand: setuptools
-    setuptools.config.pyprojecttoml: setuptools
-    setuptools.config.setupcfg: setuptools
-    setuptools.dep_util: setuptools
-    setuptools.depends: setuptools
-    setuptools.discovery: setuptools
-    setuptools.dist: setuptools
-    setuptools.errors: setuptools
-    setuptools.extension: setuptools
-    setuptools.extern: setuptools
-    setuptools.glob: setuptools
-    setuptools.installer: setuptools
-    setuptools.launch: setuptools
-    setuptools.logging: setuptools
-    setuptools.monkey: setuptools
-    setuptools.msvc: setuptools
-    setuptools.namespaces: setuptools
-    setuptools.package_index: setuptools
-    setuptools.py34compat: setuptools
-    setuptools.sandbox: setuptools
-    setuptools.unicode_utils: setuptools
-    setuptools.version: setuptools
-    setuptools.wheel: setuptools
-    setuptools.windows_support: setuptools
-    six: six
-    tabulate: tabulate
-    tabulate.version: tabulate
-    tomli: tomli
-    tomlkit: tomlkit
-    tomlkit.api: tomlkit
-    tomlkit.container: tomlkit
-    tomlkit.exceptions: tomlkit
-    tomlkit.items: tomlkit
-    tomlkit.parser: tomlkit
-    tomlkit.source: tomlkit
-    tomlkit.toml_char: tomlkit
-    tomlkit.toml_document: tomlkit
-    tomlkit.toml_file: tomlkit
-    typing_extensions: typing_extensions
-    urllib3: urllib3
-    urllib3.connection: urllib3
-    urllib3.connectionpool: urllib3
-    urllib3.contrib: urllib3
-    urllib3.contrib.appengine: urllib3
-    urllib3.contrib.ntlmpool: urllib3
-    urllib3.contrib.pyopenssl: urllib3
-    urllib3.contrib.securetransport: urllib3
-    urllib3.contrib.socks: urllib3
-    urllib3.exceptions: urllib3
-    urllib3.fields: urllib3
-    urllib3.filepost: urllib3
-    urllib3.packages: urllib3
-    urllib3.packages.backports: urllib3
-    urllib3.packages.backports.makefile: urllib3
-    urllib3.packages.six: urllib3
-    urllib3.poolmanager: urllib3
-    urllib3.request: urllib3
-    urllib3.response: urllib3
-    urllib3.util: urllib3
-    urllib3.util.connection: urllib3
-    urllib3.util.proxy: urllib3
-    urllib3.util.queue: urllib3
-    urllib3.util.request: urllib3
-    urllib3.util.response: urllib3
-    urllib3.util.retry: urllib3
-    urllib3.util.ssl_: urllib3
-    urllib3.util.ssl_match_hostname: urllib3
-    urllib3.util.ssltransport: urllib3
-    urllib3.util.timeout: urllib3
-    urllib3.util.url: urllib3
-    urllib3.util.wait: urllib3
-    wrapt: wrapt
-    wrapt.arguments: wrapt
-    wrapt.decorators: wrapt
-    wrapt.importer: wrapt
-    wrapt.wrappers: wrapt
-    yaml: PyYAML
-    yaml.composer: PyYAML
-    yaml.constructor: PyYAML
-    yaml.cyaml: PyYAML
-    yaml.dumper: PyYAML
-    yaml.emitter: PyYAML
-    yaml.error: PyYAML
-    yaml.events: PyYAML
-    yaml.loader: PyYAML
-    yaml.nodes: PyYAML
-    yaml.parser: PyYAML
-    yaml.reader: PyYAML
-    yaml.representer: PyYAML
-    yaml.resolver: PyYAML
-    yaml.scanner: PyYAML
-    yaml.serializer: PyYAML
-    yaml.tokens: PyYAML
-    yamllint: yamllint
-    yamllint.cli: yamllint
-    yamllint.config: yamllint
-    yamllint.linter: yamllint
-    yamllint.parser: yamllint
-    yamllint.rules: yamllint
-    yamllint.rules.braces: yamllint
-    yamllint.rules.brackets: yamllint
-    yamllint.rules.colons: yamllint
-    yamllint.rules.commas: yamllint
-    yamllint.rules.comments: yamllint
-    yamllint.rules.comments_indentation: yamllint
-    yamllint.rules.common: yamllint
-    yamllint.rules.document_end: yamllint
-    yamllint.rules.document_start: yamllint
-    yamllint.rules.empty_lines: yamllint
-    yamllint.rules.empty_values: yamllint
-    yamllint.rules.float_values: yamllint
-    yamllint.rules.hyphens: yamllint
-    yamllint.rules.indentation: yamllint
-    yamllint.rules.key_duplicates: yamllint
-    yamllint.rules.key_ordering: yamllint
-    yamllint.rules.line_length: yamllint
-    yamllint.rules.new_line_at_end_of_file: yamllint
-    yamllint.rules.new_lines: yamllint
-    yamllint.rules.octal_values: yamllint
-    yamllint.rules.quoted_strings: yamllint
-    yamllint.rules.trailing_spaces: yamllint
-    yamllint.rules.truthy: yamllint
-  pip_repository:
-    name: pip
-    use_pip_repository_aliases: true
-integrity: d979738b10adbbaff0884837e4414688990491c6c40f6a25d58b9bb564411477
diff --git a/examples/bzlmod_build_file_generation/BUILD.bazel b/examples/bzlmod_build_file_generation/BUILD.bazel
index 67288d6..1205817 100644
--- a/examples/bzlmod_build_file_generation/BUILD.bazel
+++ b/examples/bzlmod_build_file_generation/BUILD.bazel
@@ -52,9 +52,6 @@
         "//:requirements_windows.txt",
     ],
     tags = ["exclusive"],
-    # NOTE: we can use this flag in order to make our setup compatible with
-    # bzlmod.
-    use_pip_repository_aliases = True,
 )
 
 # Our gazelle target points to the python gazelle binary.
diff --git a/examples/bzlmod_build_file_generation/gazelle_python.yaml b/examples/bzlmod_build_file_generation/gazelle_python.yaml
index 0c7f148..46a1c8b 100644
--- a/examples/bzlmod_build_file_generation/gazelle_python.yaml
+++ b/examples/bzlmod_build_file_generation/gazelle_python.yaml
@@ -586,5 +586,4 @@
     yamllint.rules.truthy: yamllint
   pip_repository:
     name: pip
-    use_pip_repository_aliases: true
-integrity: 369584d55f2168d92c415f4c4ab4bc9d2d21a7fb0b0a6749437fcc771fd2f254
+integrity: cd25503dc6b3d9e1c5f46715ba2d0499ecc8b3d654ebcbf9f4e52f2074290e0a
diff --git a/examples/pip_parse_vendored/WORKSPACE b/examples/pip_parse_vendored/WORKSPACE
index e8cb065..157f70a 100644
--- a/examples/pip_parse_vendored/WORKSPACE
+++ b/examples/pip_parse_vendored/WORKSPACE
@@ -21,7 +21,6 @@
 # It also wouldn't be needed by users of this ruleset.
 pip_parse(
     name = "pip",
-    incompatible_generate_aliases = True,
     python_interpreter_target = interpreter,
     requirements_lock = "//:requirements.txt",
 )
diff --git a/examples/pip_parse_vendored/requirements.bzl b/examples/pip_parse_vendored/requirements.bzl
index 4bcdde9..53208f5 100644
--- a/examples/pip_parse_vendored/requirements.bzl
+++ b/examples/pip_parse_vendored/requirements.bzl
@@ -7,7 +7,7 @@
 load("@python39//:defs.bzl", "interpreter")
 load("@rules_python//python/pip_install:pip_repository.bzl", "whl_library")
 
-all_requirements = ["@pip//certifi", "@pip//charset_normalizer", "@pip//idna", "@pip//requests", "@pip//urllib3"]
+all_requirements = ["@pip//certifi:pkg", "@pip//charset_normalizer:pkg", "@pip//idna:pkg", "@pip//requests:pkg", "@pip//urllib3:pkg"]
 
 all_whl_requirements = ["@pip//certifi:whl", "@pip//charset_normalizer:whl", "@pip//idna:whl", "@pip//requests:whl", "@pip//urllib3:whl"]
 
@@ -21,16 +21,16 @@
     return name.replace("-", "_").replace(".", "_").lower()
 
 def requirement(name):
-    return "@pip_" + _clean_name(name) + "//:pkg"
+    return "@pip//{}:{}".format(_clean_name(name), "pkg")
 
 def whl_requirement(name):
-    return "@pip_" + _clean_name(name) + "//:whl"
+    return "@pip//{}:{}".format(_clean_name(name), "whl")
 
 def data_requirement(name):
-    return "@pip_" + _clean_name(name) + "//:data"
+    return "@pip//{}:{}".format(_clean_name(name), "data")
 
 def dist_info_requirement(name):
-    return "@pip_" + _clean_name(name) + "//:dist_info"
+    return "@pip//{}:{}".format(_clean_name(name), "dist_info")
 
 def entry_point(pkg, script = None):
     if not script:
diff --git a/gazelle/README.md b/gazelle/README.md
index c32f0d8..208e841 100644
--- a/gazelle/README.md
+++ b/gazelle/README.md
@@ -115,9 +115,6 @@
     # This should point to wherever we declare our python dependencies
     # (the same as what we passed to the modules_mapping rule in WORKSPACE)
     requirements = "//:requirements_lock.txt",
-    # NOTE: we can use this flag in order to make our setup compatible with
-    # bzlmod.
-    use_pip_repository_aliases = True,
 )
 ```
 
diff --git a/gazelle/manifest/defs.bzl b/gazelle/manifest/defs.bzl
index d5afe7c..f1a16c4 100644
--- a/gazelle/manifest/defs.bzl
+++ b/gazelle/manifest/defs.bzl
@@ -25,7 +25,7 @@
         pip_repository_name = "",
         pip_deps_repository_name = "",
         manifest = ":gazelle_python.yaml",
-        use_pip_repository_aliases = False,
+        use_pip_repository_aliases = None,
         **kwargs):
     """A macro for defining the updating and testing targets for the Gazelle manifest file.
 
@@ -36,7 +36,7 @@
             the manifest generator.
         pip_repository_name: the name of the pip_install or pip_repository target.
         use_pip_repository_aliases: boolean flag to enable using user-friendly
-            python package aliases.
+            python package aliases. Defaults to True.
         pip_deps_repository_name: deprecated - the old pip_install target name.
         modules_mapping: the target for the generated modules_mapping.json file.
         manifest: the target for the Gazelle manifest file.
@@ -85,11 +85,23 @@
         update_target_label,
     ]
 
-    if use_pip_repository_aliases:
+    # TODO @aignas 2023-10-31: When removing this code, cleanup the
+    # code in gazelle to only work with aliased targets.
+    if use_pip_repository_aliases == None:
+        update_args += [
+            "--omit-pip-repository-aliases-setting",
+            "true",
+        ]
+    elif use_pip_repository_aliases:
         update_args += [
             "--use-pip-repository-aliases",
             "true",
         ]
+    else:
+        update_args += [
+            "--use-pip-repository-aliases",
+            "false",
+        ]
 
     go_binary(
         name = update_target,
diff --git a/gazelle/manifest/generate/generate.go b/gazelle/manifest/generate/generate.go
index 1f56e63..006b15e 100644
--- a/gazelle/manifest/generate/generate.go
+++ b/gazelle/manifest/generate/generate.go
@@ -43,6 +43,7 @@
 		requirementsPath          string
 		pipRepositoryName         string
 		usePipRepositoryAliases   bool
+		omitUsePipRepositoryAliases   bool
 		modulesMappingPath        string
 		outputPath                string
 		updateTarget              string
@@ -66,8 +67,13 @@
 	flag.BoolVar(
 		&usePipRepositoryAliases,
 		"use-pip-repository-aliases",
-		false,
+		true,
 		"Whether to use the pip-repository aliases, which are generated when passing 'incompatible_generate_aliases = True'.")
+	flag.BoolVar(
+		&omitUsePipRepositoryAliases,
+		"omit-pip-repository-aliases-setting",
+		false,
+		"Whether to omit use-pip-repository-aliases flag serialization into the manifest.")
 	flag.StringVar(
 		&modulesMappingPath,
 		"modules-mapping",
@@ -107,13 +113,19 @@
 	}
 
 	header := generateHeader(updateTarget)
+	repository := manifest.PipRepository{
+		Name:                    pipRepositoryName,
+	}
+
+	if omitUsePipRepositoryAliases {
+		repository.UsePipRepositoryAliases = nil
+	} else {
+		repository.UsePipRepositoryAliases = &usePipRepositoryAliases
+	}
 
 	manifestFile := manifest.NewFile(&manifest.Manifest{
 		ModulesMapping: modulesMapping,
-		PipRepository: &manifest.PipRepository{
-			Name:                    pipRepositoryName,
-			UsePipRepositoryAliases: usePipRepositoryAliases,
-		},
+		PipRepository: &repository,
 	})
 	if err := writeOutput(
 		outputPath,
diff --git a/gazelle/manifest/manifest.go b/gazelle/manifest/manifest.go
index c49951d..e95ef06 100644
--- a/gazelle/manifest/manifest.go
+++ b/gazelle/manifest/manifest.go
@@ -146,5 +146,5 @@
 	Name string
 	// UsePipRepositoryAliases allows to use aliases generated pip_repository
 	// when passing incompatible_generate_aliases = True.
-	UsePipRepositoryAliases bool `yaml:"use_pip_repository_aliases,omitempty"`
+	UsePipRepositoryAliases *bool `yaml:"use_pip_repository_aliases,omitempty"`
 }
diff --git a/gazelle/python/testdata/dependency_resolution_order/BUILD.out b/gazelle/python/testdata/dependency_resolution_order/BUILD.out
index 3ea83eb..eebe6c3 100644
--- a/gazelle/python/testdata/dependency_resolution_order/BUILD.out
+++ b/gazelle/python/testdata/dependency_resolution_order/BUILD.out
@@ -9,6 +9,6 @@
     deps = [
         "//baz",
         "//somewhere/bar",
-        "@gazelle_python_test_some_foo//:pkg",
+        "@gazelle_python_test//some_foo",
     ],
 )
diff --git a/gazelle/python/testdata/file_name_matches_import_statement/BUILD.out b/gazelle/python/testdata/file_name_matches_import_statement/BUILD.out
index 0216e4b..ae1ba81 100644
--- a/gazelle/python/testdata/file_name_matches_import_statement/BUILD.out
+++ b/gazelle/python/testdata/file_name_matches_import_statement/BUILD.out
@@ -7,5 +7,5 @@
         "rest_framework.py",
     ],
     visibility = ["//:__subpackages__"],
-    deps = ["@gazelle_python_test_djangorestframework//:pkg"],
+    deps = ["@gazelle_python_test//djangorestframework"],
 )
diff --git a/gazelle/python/testdata/ignored_invalid_imported_module/BUILD.out b/gazelle/python/testdata/ignored_invalid_imported_module/BUILD.out
index b8c936a..4744166 100644
--- a/gazelle/python/testdata/ignored_invalid_imported_module/BUILD.out
+++ b/gazelle/python/testdata/ignored_invalid_imported_module/BUILD.out
@@ -4,5 +4,5 @@
     name = "ignored_invalid_imported_module",
     srcs = ["__init__.py"],
     visibility = ["//:__subpackages__"],
-    deps = ["@gazelle_python_test_foo//:pkg"],
+    deps = ["@gazelle_python_test//foo"],
 )
diff --git a/gazelle/python/testdata/monorepo/coarse_grained/BUILD.out b/gazelle/python/testdata/monorepo/coarse_grained/BUILD.out
index b11cbbd..0357705 100644
--- a/gazelle/python/testdata/monorepo/coarse_grained/BUILD.out
+++ b/gazelle/python/testdata/monorepo/coarse_grained/BUILD.out
@@ -16,5 +16,5 @@
         "foo/__init__.py",
     ],
     visibility = ["//:__subpackages__"],
-    deps = ["@root_pip_deps_rootboto3//:pkg"],
+    deps = ["@root_pip_deps//rootboto3"],
 )
diff --git a/gazelle/python/testdata/monorepo/one/BUILD.out b/gazelle/python/testdata/monorepo/one/BUILD.out
index 5098cc9..af11746 100644
--- a/gazelle/python/testdata/monorepo/one/BUILD.out
+++ b/gazelle/python/testdata/monorepo/one/BUILD.out
@@ -12,6 +12,6 @@
         "//one/bar",
         "//one/bar/baz:modified_name_baz",
         "//one/foo",
-        "@one_pip_deps_oneboto3//:pkg",
+        "@one_pip_deps//oneboto3",
     ],
 )
diff --git a/gazelle/python/testdata/monorepo/one/bar/BUILD.out b/gazelle/python/testdata/monorepo/one/bar/BUILD.out
index 6ee6515..7a4a1d6 100644
--- a/gazelle/python/testdata/monorepo/one/bar/BUILD.out
+++ b/gazelle/python/testdata/monorepo/one/bar/BUILD.out
@@ -8,5 +8,5 @@
         "//one:__subpackages__",
         "//three:__subpackages__",
     ],
-    deps = ["@one_pip_deps_oneboto3//:pkg"],
+    deps = ["@one_pip_deps//oneboto3"],
 )
diff --git a/gazelle/python/testdata/monorepo/three/BUILD.out b/gazelle/python/testdata/monorepo/three/BUILD.out
index 78a3927..2620d70 100644
--- a/gazelle/python/testdata/monorepo/three/BUILD.out
+++ b/gazelle/python/testdata/monorepo/three/BUILD.out
@@ -15,7 +15,7 @@
         "//one/bar",
         "//one/bar/baz:modified_name_baz",
         "//one/foo",
-        "@root_pip_deps_rootboto4//:pkg",
-        "@three_pip_deps_threeboto3//:pkg",
+        "@root_pip_deps//rootboto4",
+        "@three_pip_deps//threeboto3",
     ],
 )
diff --git a/gazelle/python/testdata/monorepo/two/BUILD.out b/gazelle/python/testdata/monorepo/two/BUILD.out
index 9cda007..cf22945 100644
--- a/gazelle/python/testdata/monorepo/two/BUILD.out
+++ b/gazelle/python/testdata/monorepo/two/BUILD.out
@@ -10,6 +10,6 @@
     visibility = ["//two:__subpackages__"],
     deps = [
         "//one/foo",
-        "@two_pip_deps_twoboto3//:pkg",
+        "@two_pip_deps//twoboto3",
     ],
 )
diff --git a/gazelle/python/testdata/python_ignore_dependencies_directive/BUILD.out b/gazelle/python/testdata/python_ignore_dependencies_directive/BUILD.out
index 3fb91f5..7afe61b 100644
--- a/gazelle/python/testdata/python_ignore_dependencies_directive/BUILD.out
+++ b/gazelle/python/testdata/python_ignore_dependencies_directive/BUILD.out
@@ -7,5 +7,5 @@
     name = "python_ignore_dependencies_directive",
     srcs = ["__init__.py"],
     visibility = ["//:__subpackages__"],
-    deps = ["@gazelle_python_test_boto3//:pkg"],
+    deps = ["@gazelle_python_test//boto3"],
 )
diff --git a/gazelle/python/testdata/python_target_with_test_in_name/BUILD.out b/gazelle/python/testdata/python_target_with_test_in_name/BUILD.out
index a46f5c4..32e899b 100644
--- a/gazelle/python/testdata/python_target_with_test_in_name/BUILD.out
+++ b/gazelle/python/testdata/python_target_with_test_in_name/BUILD.out
@@ -11,7 +11,7 @@
     srcs = ["real_test.py"],
     deps = [
         ":python_target_with_test_in_name",
-        "@gazelle_python_test_boto3//:pkg",
+        "@gazelle_python_test//boto3",
     ],
 )
 
diff --git a/gazelle/python/testdata/with_nested_import_statements/BUILD.out b/gazelle/python/testdata/with_nested_import_statements/BUILD.out
index 45bf265..c54bea7 100644
--- a/gazelle/python/testdata/with_nested_import_statements/BUILD.out
+++ b/gazelle/python/testdata/with_nested_import_statements/BUILD.out
@@ -4,5 +4,5 @@
     name = "with_nested_import_statements",
     srcs = ["__init__.py"],
     visibility = ["//:__subpackages__"],
-    deps = ["@gazelle_python_test_boto3//:pkg"],
+    deps = ["@gazelle_python_test//boto3"],
 )
diff --git a/gazelle/python/testdata/with_third_party_requirements/BUILD.out b/gazelle/python/testdata/with_third_party_requirements/BUILD.out
index 2a97d8b..c9330d9 100644
--- a/gazelle/python/testdata/with_third_party_requirements/BUILD.out
+++ b/gazelle/python/testdata/with_third_party_requirements/BUILD.out
@@ -9,9 +9,9 @@
     ],
     visibility = ["//:__subpackages__"],
     deps = [
-        "@gazelle_python_test_baz//:pkg",
-        "@gazelle_python_test_boto3//:pkg",
-        "@gazelle_python_test_djangorestframework//:pkg",
+        "@gazelle_python_test//baz",
+        "@gazelle_python_test//boto3",
+        "@gazelle_python_test//djangorestframework",
     ],
 )
 
@@ -20,5 +20,5 @@
     srcs = ["__main__.py"],
     main = "__main__.py",
     visibility = ["//:__subpackages__"],
-    deps = ["@gazelle_python_test_baz//:pkg"],
+    deps = ["@gazelle_python_test//baz"],
 )
diff --git a/gazelle/python/testdata/with_third_party_requirements_from_imports/BUILD.out b/gazelle/python/testdata/with_third_party_requirements_from_imports/BUILD.out
index 577f167..9d6904f 100644
--- a/gazelle/python/testdata/with_third_party_requirements_from_imports/BUILD.out
+++ b/gazelle/python/testdata/with_third_party_requirements_from_imports/BUILD.out
@@ -8,8 +8,8 @@
     ],
     visibility = ["//:__subpackages__"],
     deps = [
-        "@gazelle_python_test_google_cloud_aiplatform//:pkg",
-        "@gazelle_python_test_google_cloud_storage//:pkg",
+        "@gazelle_python_test//google_cloud_aiplatform",
+        "@gazelle_python_test//google_cloud_storage",
     ],
 )
 
@@ -20,6 +20,6 @@
     visibility = ["//:__subpackages__"],
     deps = [
         ":with_third_party_requirements_from_imports",
-        "@gazelle_python_test_google_cloud_aiplatform//:pkg",
+        "@gazelle_python_test//google_cloud_aiplatform",
     ],
 )
diff --git a/gazelle/pythonconfig/pythonconfig.go b/gazelle/pythonconfig/pythonconfig.go
index a266804..636d6a4 100644
--- a/gazelle/pythonconfig/pythonconfig.go
+++ b/gazelle/pythonconfig/pythonconfig.go
@@ -232,15 +232,16 @@
 				}
 				sanitizedDistribution := SanitizeDistribution(distributionName)
 
-				if gazelleManifest.PipRepository != nil && gazelleManifest.PipRepository.UsePipRepositoryAliases {
-					// @<repository_name>//<distribution_name>
-					lbl := label.New(distributionRepositoryName, sanitizedDistribution, sanitizedDistribution)
+				if repo := gazelleManifest.PipRepository; repo != nil && (repo.UsePipRepositoryAliases != nil && *repo.UsePipRepositoryAliases == false) {
+					// TODO @aignas 2023-10-31: to be removed later.
+					// @<repository_name>_<distribution_name>//:pkg
+					distributionRepositoryName = distributionRepositoryName + "_" + sanitizedDistribution
+					lbl := label.New(distributionRepositoryName, "", "pkg")
 					return lbl.String(), true
 				}
 
-				// @<repository_name>_<distribution_name>//:pkg
-				distributionRepositoryName = distributionRepositoryName + "_" + sanitizedDistribution
-				lbl := label.New(distributionRepositoryName, "", "pkg")
+				// @<repository_name>//<distribution_name>
+				lbl := label.New(distributionRepositoryName, sanitizedDistribution, sanitizedDistribution)
 				return lbl.String(), true
 			}
 		}
diff --git a/python/pip.bzl b/python/pip.bzl
index b779f83..fd02a56 100644
--- a/python/pip.bzl
+++ b/python/pip.bzl
@@ -77,6 +77,12 @@
         )
         install_deps_calls.append(install_deps_call)
 
+    # NOTE @aignas 2023-10-31: I am not sure it is possible to render aliases
+    # for all of the packages using the `render_pkg_aliases` function because
+    # we need to know what the list of packages for each version is and then
+    # we would be creating directories for each.
+    macro_tmpl = "@%s_{}//:{}" % rctx.attr.name
+
     requirements_bzl = """\
 # Generated by python/pip.bzl
 
@@ -87,8 +93,12 @@
 _version_map = dict()
 def _process_requirements(pkg_labels, python_version, repo_prefix):
     for pkg_label in pkg_labels:
-        workspace_name = Label(pkg_label).workspace_name
-        wheel_name = workspace_name[len(repo_prefix):]
+        wheel_name = Label(pkg_label).package
+        if not wheel_name:
+            # We are dealing with the cases where we don't have aliases.
+            workspace_name = Label(pkg_label).workspace_name
+            wheel_name = workspace_name[len(repo_prefix):]
+
         _wheel_names.append(wheel_name)
         if not wheel_name in _version_map:
             _version_map[wheel_name] = dict()
@@ -100,16 +110,16 @@
     return name.replace("-", "_").replace(".", "_").lower()
 
 def requirement(name):
-    return "@{name}_" + _clean_name(name) + "//:pkg"
+    return "{macro_tmpl}".format(_clean_name(name), "pkg")
 
 def whl_requirement(name):
-    return "@{name}_" + _clean_name(name) + "//:whl"
+    return "{macro_tmpl}".format(_clean_name(name), "whl")
 
 def data_requirement(name):
-    return "@{name}_" + _clean_name(name) + "//:data"
+    return "{macro_tmpl}".format(_clean_name(name), "data")
 
 def dist_info_requirement(name):
-    return "@{name}_" + _clean_name(name) + "//:dist_info"
+    return "{macro_tmpl}".format(_clean_name(name), "dist_info")
 
 def entry_point(pkg, script = None):
     fail("Not implemented yet")
@@ -127,6 +137,7 @@
         name = rctx.attr.name,
         install_deps_calls = "\n".join(install_deps_calls),
         load_statements = "\n".join(load_statements),
+        macro_tmpl = macro_tmpl,
         process_requirements_calls = "\n".join(process_requirements_calls),
         rules_python = rules_python,
         default_version = rctx.attr.default_version,
diff --git a/python/pip_install/pip_repository.bzl b/python/pip_install/pip_repository.bzl
index 36a777b..b9b9a07 100644
--- a/python/pip_install/pip_repository.bzl
+++ b/python/pip_install/pip_repository.bzl
@@ -317,28 +317,32 @@
         config["python_interpreter_target"] = str(rctx.attr.python_interpreter_target)
 
     if rctx.attr.incompatible_generate_aliases:
+        macro_tmpl = "@%s//{}:{}" % rctx.attr.name
         aliases = render_pkg_aliases(repo_name = rctx.attr.name, bzl_packages = bzl_packages)
         for path, contents in aliases.items():
             rctx.file(path, contents)
+    else:
+        macro_tmpl = "@%s_{}//:{}" % rctx.attr.name
 
     rctx.file("BUILD.bazel", _BUILD_FILE_CONTENTS)
     rctx.template("requirements.bzl", rctx.attr._template, substitutions = {
         "%%ALL_DATA_REQUIREMENTS%%": _format_repr_list([
-            "@{}//{}:data".format(rctx.attr.name, p) if rctx.attr.incompatible_generate_aliases else "@{}_{}//:data".format(rctx.attr.name, p)
+            macro_tmpl.format(p, "data")
             for p in bzl_packages
         ]),
         "%%ALL_REQUIREMENTS%%": _format_repr_list([
-            "@{}//{}".format(rctx.attr.name, p) if rctx.attr.incompatible_generate_aliases else "@{}_{}//:pkg".format(rctx.attr.name, p)
+            macro_tmpl.format(p, "pkg")
             for p in bzl_packages
         ]),
         "%%ALL_WHL_REQUIREMENTS%%": _format_repr_list([
-            "@{}//{}:whl".format(rctx.attr.name, p) if rctx.attr.incompatible_generate_aliases else "@{}_{}//:whl".format(rctx.attr.name, p)
+            macro_tmpl.format(p, "whl")
             for p in bzl_packages
         ]),
         "%%ANNOTATIONS%%": _format_dict(_repr_dict(annotations)),
         "%%CONFIG%%": _format_dict(_repr_dict(config)),
         "%%EXTRA_PIP_ARGS%%": json.encode(options),
         "%%IMPORTS%%": "\n".join(sorted(imports)),
+        "%%MACRO_TMPL%%": macro_tmpl,
         "%%NAME%%": rctx.attr.name,
         "%%PACKAGES%%": _format_repr_list(
             [
@@ -441,8 +445,21 @@
         doc = "Optional annotations to apply to packages",
     ),
     "incompatible_generate_aliases": attr.bool(
-        default = False,
-        doc = "Allow generating aliases '@pip//<pkg>' -> '@pip_<pkg>//:pkg'.",
+        default = True,
+        doc = """\
+If true, extra aliases will be created in the main `hub` repo - i.e. the repo
+where the `requirements.bzl` is located. This means that for a Python package
+`PyYAML` initialized within a `pip` `hub_repo` there will be the following
+aliases generated:
+- `@pip//pyyaml` will point to `@pip_pyyaml//:pkg`
+- `@pip//pyyaml:data` will point to `@pip_pyyaml//:data`
+- `@pip//pyyaml:dist_info` will point to `@pip_pyyaml//:dist_info`
+- `@pip//pyyaml:pkg` will point to `@pip_pyyaml//:pkg`
+- `@pip//pyyaml:whl` will point to `@pip_pyyaml//:whl`
+
+This is to keep the dependencies coming from PyPI to have more ergonomic label
+names and support smooth transition to `bzlmod`.
+""",
     ),
     "requirements_darwin": attr.label(
         allow_single_file = True,
diff --git a/python/pip_install/pip_repository_requirements.bzl.tmpl b/python/pip_install/pip_repository_requirements.bzl.tmpl
index 411f334..92ea5be 100644
--- a/python/pip_install/pip_repository_requirements.bzl.tmpl
+++ b/python/pip_install/pip_repository_requirements.bzl.tmpl
@@ -20,16 +20,16 @@
     return name.replace("-", "_").replace(".", "_").lower()
 
 def requirement(name):
-    return "@%%NAME%%_" + _clean_name(name) + "//:pkg"
+    return "%%MACRO_TMPL%%".format(_clean_name(name), "pkg")
 
 def whl_requirement(name):
-    return "@%%NAME%%_" + _clean_name(name) + "//:whl"
+    return "%%MACRO_TMPL%%".format(_clean_name(name), "whl")
 
 def data_requirement(name):
-    return "@%%NAME%%_" + _clean_name(name) + "//:data"
+    return "%%MACRO_TMPL%%".format(_clean_name(name), "data")
 
 def dist_info_requirement(name):
-    return "@%%NAME%%_" + _clean_name(name) + "//:dist_info"
+    return "%%MACRO_TMPL%%".format(_clean_name(name), "dist_info")
 
 def entry_point(pkg, script = None):
     if not script: