diff --git a/src/poetry/console/commands/build.py b/src/poetry/console/commands/build.py index 0de6728b37a..a50086fee31 100644 --- a/src/poetry/console/commands/build.py +++ b/src/poetry/console/commands/build.py @@ -13,6 +13,10 @@ if TYPE_CHECKING: from cleo.io.inputs.option import Option + from cleo.io.io import IO + + from poetry.poetry import Poetry + from poetry.utils.env import Env class BuildCommand(EnvCommand): @@ -47,49 +51,61 @@ class BuildCommand(EnvCommand): "poetry.core.masonry.builders.wheel", ] - def _build( - self, - fmt: str, - executable: str | Path | None = None, - *, - target_dir: Path | None = None, - ) -> None: + def handle(self) -> int: + return self.build( + self.poetry, + self.env, + self.io, + self.option("format"), + self.option("clean"), + self.option("local-version"), + self.option("output"), + ) + + @staticmethod + def build( + poetry: Poetry, + env: Env, + io: IO, + format: str = "all", + clean: bool = True, + local_version_label: str | None = None, + output: str = "dist", + ) -> int: from poetry.masonry.builders import BUILD_FORMATS - if fmt in BUILD_FORMATS: - builders = [BUILD_FORMATS[fmt]] - elif fmt == "all": - builders = list(BUILD_FORMATS.values()) - else: - raise ValueError(f"Invalid format: {fmt}") - - if local_version_label := self.option("local-version"): - self.poetry.package.version = self.poetry.package.version.replace( - local=local_version_label + if not poetry.is_package_mode: + io.write_error_line( + "Building a package is not possible in non-package mode." ) - - for builder in builders: - builder(self.poetry, executable=executable).build(target_dir) - - def handle(self) -> int: - if not self.poetry.is_package_mode: - self.line_error("Building a package is not possible in non-package mode.") return 1 - with build_environment(poetry=self.poetry, env=self.env, io=self.io) as env: - fmt = self.option("format") or "all" - dist_dir = Path(self.option("output")) - package = self.poetry.package - self.line( + with build_environment(poetry=poetry, env=env, io=io) as env: + dist_dir = Path(output) + package = poetry.package + io.write_line( f"Building {package.pretty_name} ({package.version})" ) if not dist_dir.is_absolute(): - dist_dir = self.poetry.pyproject_path.parent / dist_dir + dist_dir = poetry.pyproject_path.parent / dist_dir - if self.option("clean"): + if clean: remove_directory(path=dist_dir, force=True) - self._build(fmt, executable=env.python, target_dir=dist_dir) + if format in BUILD_FORMATS: + builders = [BUILD_FORMATS[format]] + elif format == "all": + builders = list(BUILD_FORMATS.values()) + else: + raise ValueError(f"Invalid build format: {format}") + + if local_version_label: + poetry.package.version = poetry.package.version.replace( + local=local_version_label + ) + + for builder in builders: + builder(poetry, executable=env.python).build(dist_dir) return 0 diff --git a/src/poetry/console/commands/publish.py b/src/poetry/console/commands/publish.py index a9395620cb9..0ceb143d3f4 100644 --- a/src/poetry/console/commands/publish.py +++ b/src/poetry/console/commands/publish.py @@ -72,6 +72,9 @@ def handle(self) -> int: # Building package first, if told if self.option("build"): + from poetry.console.commands.build import BuildCommand + from poetry.utils.env import EnvManager + if publisher.files and not self.confirm( f"There are {len(publisher.files)} files ready for" " publishing. Build anyway?" @@ -79,8 +82,8 @@ def handle(self) -> int: self.line_error("Aborted!") return 1 - - self.call("build", args=f"--output {dist_dir}") + env = EnvManager(self.poetry, io=self.io).create_venv() + BuildCommand.build(self.poetry, env, self.io, output=dist_dir) files = publisher.files if not files: