diff --git a/src/poetry/console/commands/publish.py b/src/poetry/console/commands/publish.py
index 98c0bebe896..3927bffc2cb 100644
--- a/src/poetry/console/commands/publish.py
+++ b/src/poetry/console/commands/publish.py
@@ -72,9 +72,13 @@ def handle(self) -> int:
# Building package first, if told
if self.option("build"):
- if publisher.files and not self.confirm(
- f"There are {len(publisher.files)} files ready for"
- " publishing. Build anyway?"
+ if (
+ publisher.files
+ and self.io.is_interactive()
+ and not self.confirm(
+ f"There are {len(publisher.files)} files ready for"
+ " publishing. Build anyway?"
+ )
):
self.line_error("Aborted!")
diff --git a/tests/console/commands/test_publish.py b/tests/console/commands/test_publish.py
index 31723ac8ce3..016b4858bcd 100644
--- a/tests/console/commands/test_publish.py
+++ b/tests/console/commands/test_publish.py
@@ -5,6 +5,7 @@
from pathlib import Path
from typing import TYPE_CHECKING
from typing import NoReturn
+from unittest.mock import PropertyMock
import pytest
import requests
@@ -215,3 +216,29 @@ def test_publish_dist_dir_and_build_options(
assert "Publishing simple-project (1.2.3) to PyPI" in output
assert "- Uploading simple_project-1.2.3.tar.gz" in error
assert "- Uploading simple_project-1.2.3-py2.py3-none-any.whl" in error
+
+
+def test_publish_build_no_interaction_skips_confirmation(
+ app_tester: ApplicationTester, mocker: MockerFixture
+) -> None:
+ mocker.patch(
+ "poetry.publishing.publisher.Publisher.files",
+ new_callable=PropertyMock,
+ return_value=[Path("dist/simple_project-1.2.3-py2.py3-none-any.whl")],
+ )
+ confirm = mocker.patch("poetry.console.commands.publish.PublishCommand.confirm")
+ command_call = mocker.patch("poetry.console.commands.publish.PublishCommand.call")
+ publisher_files = mocker.patch(
+ "poetry.publishing.publisher.Publisher.files",
+ new_callable=mocker.PropertyMock,
+ return_value=[Path("dist/existing.whl")],
+ )
+ publisher_publish = mocker.patch("poetry.publishing.Publisher.publish")
+
+ exit_code = app_tester.execute("publish --build --no-interaction --dry-run")
+
+ assert exit_code == 0
+ confirm.assert_not_called()
+ command_call.assert_called_once_with("build", args="--output dist")
+ assert publisher_files.call_count >= 1
+ assert publisher_publish.call_count == 1