{"id":"062fb341a4f4d96d","repo":"python-poetry/poetry","slug":"invalid-build-config-setting-value-it-must-be","errorCode":null,"errorMessage":"Invalid build config setting '{value}'. It must be a valid JSON with each property a string or a list of strings.","messagePattern":"Invalid build config setting '(.+?)'\\. It must be a valid JSON with each property a string or a list of strings\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/poetry/console/commands/config.py","lineNumber":358,"sourceCode":"        if m:\n            key = f\"installer.build-config-settings.{canonicalize_name(m.group(1))}\"\n\n            if self.option(\"unset\"):\n                config.config_source.remove_property(key)\n                return 0\n\n            try:\n                settings = config.config_source.get_property(key)\n            except PropertyNotFoundError:\n                settings = {}\n\n            for value in values:\n                if build_config_setting_validator(value):\n                    config_settings = build_config_setting_normalizer(value)\n                    for setting_name, item in config_settings.items():\n                        settings[setting_name] = item\n                else:\n                    raise ValueError(\n                        f\"Invalid build config setting '{value}'. \"\n                        \"It must be a valid JSON with each property a string or a list of strings.\"\n                    )\n\n            config.config_source.add_property(key, settings)\n\n            return 0\n\n        raise ValueError(f\"Setting {self.argument('key')} does not exist\")\n\n    def _handle_single_value(\n        self,\n        source: ConfigSource,\n        key: str,\n        callbacks: tuple[Any, Any],\n        values: list[Any],\n    ) -> int:\n        validator, normalizer = callbacks","sourceCodeStart":340,"sourceCodeEnd":376,"githubUrl":"https://github.com/python-poetry/poetry/blob/92b74dcfe348d0e01e14d40d6c1fa47a4ee04a54/src/poetry/console/commands/config.py#L340-L376","documentation":"Raised when setting `installer.build-config-settings.<name>` (config.py:339-361) and a value fails `build_config_setting_validator`. Each value must be a JSON object whose properties are strings or lists of strings, matching PEP 517 config-settings semantics. Poetry stores them verbatim to forward to build backends.","triggerScenarios":"Running `poetry config installer.build-config-settings.foo '{not json}'` or passing a JSON whose values are numbers/objects instead of strings or lists of strings.","commonSituations":"Trying to configure a build backend (setuptools, hatchling) with malformed config-settings; forgetting that the whole value must be a JSON object; passing `--config-setting` style `key=value` pairs instead of JSON.","solutions":["Pass a JSON object with string or list-of-string values: `poetry config installer.build-config-settings.foo '{\"--build-option\": \"--foo\"}'`.","Validate the JSON with `python -c \"import json,sys; json.loads(sys.argv[1])\" '<value>'` before running the command.","Ensure no trailing commas or unquoted keys that TOML/JSON parsers would reject."],"exampleFix":"# before\npoetry config installer.build-config-settings.setuptools '{\"--global-option\": [\"--with-num\"]}'  # if value type wrong\n# after\npoetry config installer.build-config-settings.setuptools '{\"--build-option\": \"--with-num\"}'","handlingStrategy":"validation","validationCode":"import json\nraw = '{\"--build-option\": \"--foo\"}'\nobj = json.loads(raw)  # raises if not JSON\nassert isinstance(obj, dict) and all(\n    isinstance(v, (str, list)) and all(isinstance(x, str) for x in v)\n    for v in obj.values()\n), \"values must be str or list[str]\"","typeGuard":"def is_valid_build_config_setting(raw: str) -> bool:\n    try:\n        obj = json.loads(raw)\n    except (TypeError, ValueError):\n        return False\n    return isinstance(obj, dict) and all(\n        isinstance(v, str) or (\n            isinstance(v, list) and all(isinstance(x, str) for x in v)\n        )\n        for v in obj.values()\n    )","tryCatchPattern":null,"preventionTips":["Always pass a JSON object, never bare `key=value` strings.","Validate JSON with `python -m json.tool` before configuring.","Keep a checked-in reference of build-config-settings for the team."],"tags":["config","build","json","pep517"],"analyzedSha":"92b74dcfe348d0e01e14d40d6c1fa47a4ee04a54","analyzedAt":"2026-08-04T20:33:34.072Z","schemaVersion":2}