mirror of
https://github.com/NixOS/nix
synced 2025-06-25 06:31:14 +02:00
Merge pull request #13273 from NixOS/deprecate-structured-attrs-hack
Deprecate hacky way of making structured attrs
This commit is contained in:
commit
20226c85bc
5 changed files with 26 additions and 1 deletions
11
doc/manual/rl-next/deprecate__json.md
Normal file
11
doc/manual/rl-next/deprecate__json.md
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
---
|
||||||
|
synopsis: Deprecate manually making structured attrs with `__json = ...;`
|
||||||
|
prs: [13220]
|
||||||
|
---
|
||||||
|
|
||||||
|
The proper way to create a derivation using [structured attrs] in the Nix language is by using `__structuredAttrs = true` with [`builtins.derivation`].
|
||||||
|
However, by exploiting how structured attrs are implementated, it has also been possible to create them by setting the `__json` environment variable to a serialized JSON string.
|
||||||
|
This sneaky alternative method is now deprecated, and may be disallowed in future versions of Nix.
|
||||||
|
|
||||||
|
[structured attrs]: @docroot@/language/advanced-attributes.md#adv-attr-structuredAttrs
|
||||||
|
[`builtins.derivation`]: @docroot@/language/builtins.html#builtins-derivation
|
|
@ -212,6 +212,7 @@ EvalState::EvalState(
|
||||||
, sRight(symbols.create("right"))
|
, sRight(symbols.create("right"))
|
||||||
, sWrong(symbols.create("wrong"))
|
, sWrong(symbols.create("wrong"))
|
||||||
, sStructuredAttrs(symbols.create("__structuredAttrs"))
|
, sStructuredAttrs(symbols.create("__structuredAttrs"))
|
||||||
|
, sJson(symbols.create("__json"))
|
||||||
, sAllowedReferences(symbols.create("allowedReferences"))
|
, sAllowedReferences(symbols.create("allowedReferences"))
|
||||||
, sAllowedRequisites(symbols.create("allowedRequisites"))
|
, sAllowedRequisites(symbols.create("allowedRequisites"))
|
||||||
, sDisallowedReferences(symbols.create("disallowedReferences"))
|
, sDisallowedReferences(symbols.create("disallowedReferences"))
|
||||||
|
|
|
@ -213,7 +213,7 @@ public:
|
||||||
const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName, sValue,
|
const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName, sValue,
|
||||||
sSystem, sOverrides, sOutputs, sOutputName, sIgnoreNulls,
|
sSystem, sOverrides, sOutputs, sOutputName, sIgnoreNulls,
|
||||||
sFile, sLine, sColumn, sFunctor, sToString,
|
sFile, sLine, sColumn, sFunctor, sToString,
|
||||||
sRight, sWrong, sStructuredAttrs,
|
sRight, sWrong, sStructuredAttrs, sJson,
|
||||||
sAllowedReferences, sAllowedRequisites, sDisallowedReferences, sDisallowedRequisites,
|
sAllowedReferences, sAllowedRequisites, sDisallowedReferences, sDisallowedRequisites,
|
||||||
sMaxSize, sMaxClosureSize,
|
sMaxSize, sMaxClosureSize,
|
||||||
sBuilder, sArgs,
|
sBuilder, sArgs,
|
||||||
|
|
|
@ -1427,6 +1427,8 @@ static void derivationStrictInternal(
|
||||||
else if (i->name == state.sOutputHashMode) handleHashMode(s);
|
else if (i->name == state.sOutputHashMode) handleHashMode(s);
|
||||||
else if (i->name == state.sOutputs)
|
else if (i->name == state.sOutputs)
|
||||||
handleOutputs(tokenizeString<Strings>(s));
|
handleOutputs(tokenizeString<Strings>(s));
|
||||||
|
else if (i->name == state.sJson)
|
||||||
|
warn("In derivation '%s': setting structured attributes via '__json' is deprecated, and may be disallowed in future versions of Nix. Set '__structuredAttrs = true' instead.", drvName);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,3 +40,14 @@ jsonOut="$(nix print-dev-env -f structured-attrs-shell.nix --json)"
|
||||||
test "$(<<<"$jsonOut" jq '.structuredAttrs|keys|.[]' -r)" = "$(printf ".attrs.json\n.attrs.sh")"
|
test "$(<<<"$jsonOut" jq '.structuredAttrs|keys|.[]' -r)" = "$(printf ".attrs.json\n.attrs.sh")"
|
||||||
|
|
||||||
test "$(<<<"$jsonOut" jq '.variables.outputs.value.out' -r)" = "$(<<<"$jsonOut" jq '.structuredAttrs.".attrs.json"' -r | jq -r '.outputs.out')"
|
test "$(<<<"$jsonOut" jq '.variables.outputs.value.out' -r)" = "$(<<<"$jsonOut" jq '.structuredAttrs.".attrs.json"' -r | jq -r '.outputs.out')"
|
||||||
|
|
||||||
|
# Hacky way of making structured attrs. We should preserve for now for back compat, but also deprecate.
|
||||||
|
|
||||||
|
hackyExpr='derivation { name = "a"; system = "foo"; builder = "/bin/sh"; __json = builtins.toJSON { a = 1; }; }'
|
||||||
|
|
||||||
|
# Check for deprecation message
|
||||||
|
expectStderr 0 nix-instantiate --expr "$hackyExpr" --eval --strict | grepQuiet "In derivation 'a': setting structured attributes via '__json' is deprecated, and may be disallowed in future versions of Nix. Set '__structuredAttrs = true' instead."
|
||||||
|
|
||||||
|
# Check it works with the expected structured attrs
|
||||||
|
hacky=$(nix-instantiate --expr "$hackyExpr")
|
||||||
|
nix derivation show "$hacky" | jq --exit-status '."'"$hacky"'".env.__json | fromjson | . == {"a": 1}'
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue