mirror of
https://github.com/NixOS/nix
synced 2025-06-24 22:11:15 +02:00
Deprecate hacky way of making structured attrs
The method tested for in the previous commit is now deprecated. Co-authored-by: Eelco Dolstra <edolstra@gmail.com>
This commit is contained in:
parent
a353b2f4b2
commit
7577d2d3ae
5 changed files with 18 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,9 @@ test "$(<<<"$jsonOut" jq '.variables.outputs.value.out' -r)" = "$(<<<"$jsonOut"
|
||||||
|
|
||||||
hackyExpr='derivation { name = "a"; system = "foo"; builder = "/bin/sh"; __json = builtins.toJSON { a = 1; }; }'
|
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
|
# Check it works with the expected structured attrs
|
||||||
hacky=$(nix-instantiate --expr "$hackyExpr")
|
hacky=$(nix-instantiate --expr "$hackyExpr")
|
||||||
nix derivation show "$hacky" | jq --exit-status '."'"$hacky"'".env.__json | fromjson | . == {"a": 1}'
|
nix derivation show "$hacky" | jq --exit-status '."'"$hacky"'".env.__json | fromjson | . == {"a": 1}'
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue