Skip to main content

A Pants plugin adding support for packaging SCIE.

Project description

pants-scie-plugin

This plugin provides a scie_binary target that can be used to create a single-file Python executable with an embedded Python interpreter, built via scie-jump.

It uses science and a .toml configuration file to build the executable, expecting a pex_binary as a dependency.

Installation

This plugin was tested on Python 3.9 and Pants 2.20.

Add the following to your pants.toml file:

[GLOBAL]
plugins = [
    ...
    "robotpajamas.pants.scie",
]

...

backend_packages = [
    ...
    "experimental.scie",
]

Usage

At the moment, the scie_binary expects a pex_binary as its only dependency. There is no technical limitation to this, but it simplified the initial implementation.

For trivial packaging, you can set an entry_point on your pex_binary and the scie_binary will directly call your pex (e.g. python myapp.pex). This can be particularly useful for CLIs or other simple applications. The name of your binary will be the name of your scie_binary target, and it will be placed in the dist directory.

# BUILD

pex_binary(
    name="mycli-pex",
    entry_point="mycli.main",
    ...
)

scie_binary(
    name="mycli",
    dependencies=[":mycli-pex"],
    ...
)

You can optionally cross-build your executable by setting the platforms field on your scie_binary target. This will create a binary for the specified platform, and will be named accordingly (e.g. mycli-linux-x86_64). You should also ensure that your pex_binary is built for the same platform(s).

# BUILD

pex_binary(
    name="mycli-pex",
    entry_point="mycli.main",
    platforms=["linux-x86_64-cp-311-cp311", "macosx-13.3-arm64-cp-311-cp311",]
    ...
)

scie_binary(
    name="mycli",
    dependencies=[":mycli-pex"],
    platforms=["linux-x86_64", "macos-aarch64",]
    ...
)

Advanced Usage

For non-trivial packaging, it is much easier (and cleaner) to use the science config TOML file to specify what should be in the package and how it should work. This may be in situations where you want multiple commands, or you require boot bindings. A good example of this is setting up a FastAPI application with a Uvicorn or Gunicorn runner, which requires using PEX_TOOLS and creating a venv from your code.

The plugin will attempt to replace variables in the TOML with equivalent ones specified in the target. For example, the binary name, the binary description, platforms (if specified), etc... The one critical aspect to note is that in order to reference another target (e.g. the output of pex_binary), use the :target_name syntax in the TOML. The plugin will use science's --file mapping argument to replace the target name with the actual file path.

# BUILD

pex_binary(
    name="hellofastapi-pex",
    entry_point="hellofastapi.main",
    dependencies=[":libhellofastapi"],
    include_tools=True,
)

scie_binary(
    name="hellofastapi",
    dependencies=[":hellofastapi-pex"],
    lift="lift.toml",
    ...
)
# lift.toml

[lift]
name = "hellofastapi"
description = "An example FastAPI Lift application including using an external uvicorn server"

[[lift.interpreters]]
id = "cpython"
provider = "PythonBuildStandalone"
release = "20230507"
version = "3.11.3"

[[lift.files]]
# Note the leading colon, which is required to reference the pex_binary dependency
name = ":hellofastapi-pex"

[[lift.commands]]
exe = "{scie.bindings.venv}/venv/bin/uvicorn"
args = ["hellofastapi.main:app", "--port", "7999"]
description = "The FastAPI executable."

[[lift.bindings]]
name = "venv"
description = "Installs HelloFastAPI into a venv and pre-compiles .pyc"
exe = "#{cpython:python}"
args = [
    "{:hellofastapi-pex}",
    "venv",
    "--bin-path",
    "prepend",
    "--compile",
    "--rm",
    "all",
    "{scie.bindings}/venv",
]

[lift.bindings.env.default]
"=PATH" = "{cpython}/python/bin:{scie.env.PATH}"
"PEX_TOOLS" = "1"
"PEX_ROOT" = "{scie.bindings}/pex_root"

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

robotpajamas.pants.scie-0.0.5-py3-none-any.whl (11.6 kB view details)

Uploaded Python 3

File details

Details for the file robotpajamas.pants.scie-0.0.5-py3-none-any.whl.

File metadata

File hashes

Hashes for robotpajamas.pants.scie-0.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 922e1a87f21236bf4e79c26befe598c0377e106702cfb0671411bc4a16b89ddf
MD5 711b3885b3b8721bb4535aa58889c082
BLAKE2b-256 a440ec1f18054d474f2e3ff7c9161e52e88a0a2243271fffca7acf55080d3a3a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page