ITADN

ENH: selectors for non-list items; missing `build_platform` for evaluation of `context:`?

#2632Openh-vetinari 创建于 2026-07-04
H
h-vetinaricommented
I have a v0 recipe that got translated from ```yaml sources: - fn: bazel url: {{ bz_base_url }}/{{ bz_version }}/bazel_nojdk-{{ bz_version }}-linux-x86_64 # [build_platform == "linux-64"] sha256: 218ce0aed544d29084f4d9ff98f01bc784b90fe4c79dab63fa990dc68e66eaa9 # [build_platform == "linux-64"] url: {{ bz_base_url }}/{{ bz_version }}/bazel_nojdk-{{ bz_version }}-darwin-x86_64 # [build_platform == "osx-64"] sha256: ccc67fa48a6444818a5b85e8174c89ca2630df60c1e2327714d944035a240fc9 # [build_platform == "osx-64"] ``` to ```yaml context: version: "1.82.1" bz_version: "8.6.0" bz_base_url: https://github.com/bazelbuild/bazel/releases/download [...] source: - if: build_platform == "linux-64" then: url: ${{ bz_base_url }}/${{ bz_version }}/bazel_nojdk-${{ bz_version }}-linux-x86_64 sha256: 02c355741012603b703e2a8d07ded1212f92ec6eacdabdd552695f8083e7a594 file_name: bazel - if: build_platform == "osx-64" then: url: ${{ bz_base_url }}/${{ bz_version }}/bazel_nojdk-${{ bz_version }}-darwin-x86_64 sha256: 6a6d0a42d62fc3a4a391d0b9976f750191ccb9afa7b084e78d0daa0422b202d0 file_name: bazel - if: build_platform == "linux-aarch64" then: url: ${{ bz_base_url }}/${{ bz_version }}/bazel_nojdk-${{ bz_version }}-linux-arm64 sha256: 19b9c2f6dbb87d9d9c64a951e01b9e62abe8b8ea07550206609c62b7f0f12ae9 file_name: bazel - if: build_platform == "osx-arm64" then: url: ${{ bz_base_url }}/${{ bz_version }}/bazel_nojdk-${{ bz_version }}-darwin-arm64 sha256: 61776a387f2ea2a515eb92bc1c520b6af6451148216244058f6ee2b4c012cd89 file_name: bazel ``` There's several pieces of duplication that I don't like with this, but I can't simply break out `file_name: bazel`, and then leave the other keys for that section behind v1-selectors, because they're on the level of keys (i.e. `url:` and not list-items `- foo`). So ```yaml source: - file_name: bazel if: build_platform == "linux-64" then: url: ${{ bz_base_url }}/${{ bz_version }}/bazel_nojdk-${{ bz_version }}-linux-x86_64 sha256: 02c355741012603b703e2a8d07ded1212f92ec6eacdabdd552695f8083e7a594 if: build_platform == "linux-aarch64" then: url: ${{ bz_base_url }}/${{ bz_version }}/bazel_nojdk-${{ bz_version }}-linux-arm64 sha256: 19b9c2f6dbb87d9d9c64a951e01b9e62abe8b8ea07550206609c62b7f0f12ae9 if: build_platform == "osx-64" then: url: ${{ bz_base_url }}/${{ bz_version }}/bazel_nojdk-${{ bz_version }}-darwin-x86_64 sha256: 6a6d0a42d62fc3a4a391d0b9976f750191ccb9afa7b084e78d0daa0422b202d0 if: build_platform == "osx-arm64" then: url: ${{ bz_base_url }}/${{ bz_version }}/bazel_nojdk-${{ bz_version }}-darwin-arm64 sha256: 61776a387f2ea2a515eb92bc1c520b6af6451148216244058f6ee2b4c012cd89 ``` does not work, for example. I got it to pass the linter with ```yaml context: version: "1.82.1" bz_version: "8.6.0" bz_base_url: https://github.com/bazelbuild/bazel/releases/download bz_os: ${{ "linux" if linux else "darwin" }} bz_arch: ${{ "x86_64" if x86_64 else "arm64" }} [...] source: - url: ${{ bz_base_url }}/${{ bz_version }}/bazel_nojdk-${{ bz_version }}-${{ bz_os }}-${{ bz_arch }} file_name: bazel sha256: - if: build_platform == "linux-64" then: 02c355741012603b703e2a8d07ded1212f92ec6eacdabdd552695f8083e7a594 - if: build_platform == "linux-aarch64" then: 19b9c2f6dbb87d9d9c64a951e01b9e62abe8b8ea07550206609c62b7f0f12ae9 - if: build_platform == "osx-64" then: 6a6d0a42d62fc3a4a391d0b9976f750191ccb9afa7b084e78d0daa0422b202d0 - if: build_platform == "osx-arm64" then: 61776a387f2ea2a515eb92bc1c520b6af6451148216244058f6ee2b4c012cd89 ``` but that fails with ``` ╭─[/home/conda/recipe_root/recipe.yaml:23:7] 22 │ sha256: 23 │ ╭─▶ - if: build_platform == "linux-64" 24 │ │ then: 02c355741012603b703e2a8d07ded1212f92ec6eacdabdd552695f8083e7a594 25 │ │ - if: build_platform == "linux-aarch64" 26 │ │ then: 19b9c2f6dbb87d9d9c64a951e01b9e62abe8b8ea07550206609c62b7f0f12ae9 27 │ │ - if: build_platform == "osx-64" 28 │ │ then: 6a6d0a42d62fc3a4a391d0b9976f750191ccb9afa7b084e78d0daa0422b202d0 29 │ │ - if: build_platform == "osx-arm64" 30 │ │ then: 61776a387f2ea2a515eb92bc1c520b6af6451148216244058f6ee2b4c012cd89 31 │ ├─▶ · ╰──── expected scalar but got non-scalar 32 │ build: 33 │ number: 1 ╰──── ``` Interestingly, it _also_ fails when I pack everything into a single `${{ }}`, or even into `context:` ```yaml context: version: "1.82.1" bz_version: "8.6.0" bz_base_url: https://github.com/bazelbuild/bazel/releases/download bz_os: ${{ "linux" if linux else "darwin" }} bz_arch: ${{ "x86_64" if x86_64 else "arm64" }} bz_sha: ${{ "02c355741012603b703e2a8d07ded1212f92ec6eacdabdd552695f8083e7a594" if build_platform == "linux-64" else "19b9c2f6dbb87d9d9c64a951e01b9e62abe8b8ea07550206609c62b7f0f12ae9" if build_platform == "linux-aarch64" else "6a6d0a42d62fc3a4a391d0b9976f750191ccb9afa7b084e78d0daa0422b202d0" if build_platform == "osx-64" else "61776a387f2ea2a515eb92bc1c520b6af6451148216244058f6ee2b4c012cd89" if build_platform == "osx-arm64" else "0" }} [...] source: - url: ${{ bz_base_url }}/${{ bz_version }}/bazel_nojdk-${{ bz_version }}-${{ bz_os }}-${{ bz_arch }} sha256: ${{ bz_sha }} file_name: bazel ``` It seems that `build_platform` is not actually available (or correctly populated) during `context:` evaluation, because it falls into the final `else "0"` branch, which should be impossible ``` 24 | - url: ${{ bz_base_url }}/${{ bz_version }}/bazel_nojdk-${{ bz_version }}-${{ bz_os }}-${{ bz_arch }} 25 | sha256: ${{ bz_sha }} : ^|^ : `-- invalid value for 'SHA256 checksum': Invalid SHA256 checksum: 0 26 | file_name: bazel `---- ```
0 条评论