PYTHON PACKAGING AND DISTRIBUTION USING HATCH 1.9
       
       <2024-01-01 Mon 00:03>
       
       I struggled getting a simple Python CLI application properly packaged
       for distribution. Now that I've finally got it, I'm writing it down so
       I can remember the process for the entire month that it will be valid
       before becoming out-of-date. Yay for volatile programming language
       developments!
       
       Context: my objective was to create a file that I could shuttle along to another system, wherein it could be installed in an isolated, virtual environment, without having to manage dependencies. Initially I followed the guide on the Python website for packaging and distributing files.[1] The guide uses `Hatch'. It's a helpful guide, though it omits by CLI objectives. For that I had to sniff around, eventually finding more documentation on the Python and Hatch websites.[2] I must be some dummy though, because I couldn't get it without a lot of trial and error. Anyways, after a lot of fooling around, I finally got something working. Here are the steps. Note: this process assumes you are working in a virtual environment. If not, now could be a good time to start:
       
       ,----
       | python -m venv env
       `----
       
       
       Install build dependencies
       ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       ,----
       | source env/bin/activate
       | pip install build pyinstaller hatch
       `----
       
       
       Create the proper project structure
       ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       Follow the project structure below. Note that the module inside the
       `src' directory is for example purposes only.
       
       ,----
       | ./
       | ./pyproject.toml
       | ./src/meme_maker/image_macro.py
       | ./src/meme_maker/__init__.py
       `----
       
       Inside of `pyproject.toml' should look at minimum like this:
       
       ,----
       | [build-system]
       | requires = ["hatchling", "pyinstaller"]
       | build-backend = "hatchling.build"
       | [project]
       | name = "meme-maker-cli"
       | version = "0.1"
       | description = 'Make memes from the CLI'
       | requires-python = ">=3.11"
       | authors = [
       |   { name = "Some One" },
       | ]
       | [project.scripts]
       | make-image-macro = "meme_maker.image_macro:main"
       | [tool.hatch.build.targets.wheel]
       | packages = ["src/meme_maker"]
       | [tool.hatch.build.targets.sdist]
       | exclude = [
       |   "/env",
       |   "/dist"
       | ]
       `----
       
       
       Build the project
       ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       The project should be built from inside the virtual
       environment. Simply run `hatch build'. This will output
       `meme-maker-cli-0.1-py3-none-any.whl' inside of a new `dist'
       directory.
       
       
       Install the project
       ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       For this part you should be outside of a Python virtual
       environment. Install `python3-pipx' from your distribution package
       manager; or, by using `pip' inside a virtual environment. Then run
       `pipx install meme-maker-cli-0.1-py3-none-any.whl'. Note: older
       versions of `pipx' require the wheel to be specified as a local path
       like `./meme-maker-cli-0.1-py3-none-any.whl'. You can now invoke the
       CLI using `make-image-macro'.
       
       
       Footnotes
       ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       
       
       
       Footnotes
       _________
       
       [1]
       
       [2]