【问题标题】:Do anchors and aliases in YAML store the string or the interpolated string?YAML 中的锚点和别名是存储字符串还是插值字符串?
【发布时间】:2021-08-28 13:51:49
【问题描述】:

当我在 CircleCI 上运行以下作业时,缓存键在正在读取的缓存和正在写入的缓存之间神秘地变化。我能想到的唯一解释是我对 YAML 中的锚点和别名的理解是不正确的。

我正在使用 YAML anchor and alias 在读取缓存键时捕获它,然后在写入时将其读回。然而不知何故,这两个键是不同的(好像正在重新评估该行)。

commands:
  npm_install:
    description: Install and cache (cached) node modules
    steps:
      - restore_cache:
          key: &NPM_CACHE_KEY v8-npm--{{ .Branch }}-{{arch}}-{{checksum "~/project/angular/package-lock.json"}}

      - run:
          name: Install Node modules
          command: |
            cd ~/project/angular
            npm install ci

      - save_cache:
          key: *NPM_CACHE_KEY
          paths:
              - ~/project/angular/node_modules/
              - /usr/local/bin/node_modules
              - /home/circleci/.cache/

运行结果如下:

放大缓存键行可以看到缓存键不同。

# When reading the cache
v8-npm--add_angular_version_display-arch1-linux-amd64-6_85-IXQLtfeuATYKtD1dRoCJu_FbRnfhYZb1+XkVFRET5Pc=

---

#When writing the cache
v8-npm--add_angular_version_display-arch1-linux-amd64-6_85-0wC66hCG9ZcSN9wfW4NlpxQswHV+n4foEcQ15cWRxqg=

YAML 锚/别名方法是否保存插值或未插值的字符串?

撇开为什么package-lock.json 文件可能首先发生变化的问题不谈,还有另一个问题。为什么这两个键不同? YAML 是否被重新插值?

保存到&NPM_CACHE_KEY的内容是内插值,即v8-npm--add_angular_version_display-arch1-linux-amd64-6_85-IXQLtfeuATYKtD1dRoCJu_FbRnfhYZb1+XkVFRET5Pc=

或者...它是在保存 ``NPM_CACHE_KEY v8-npm--{{ .Branch }}-{{arch}}-{{checksum "~/project/angular/package-lock.json"}}`并重新评估第二次?

如果锚点/别名重新插入,那么什么不会?

如果锚点正在重新插值,那么我怎样才能让它简单地存储输出?

(我还有另一个问题,这就是为什么 package-lock 的哈希值正在改变,但这是一个单独的问题)

【问题讨论】:

  • npm install ci 安装a package named ci,只是顺便安装了其他依赖项,因此更改了锁定文件;我想你的意思是npm civ8-npm--{{ .Branch }}-{{arch}}-{{checksum "~/project/angular/package-lock.json"}} 正在由 CircleCI 填写,YAML 中的实际值包含占位符 - 通过例如运行它yamllint.com 看看它是如何扩展的。
  • @jonrsharpe 哇,ci 的好地方,这是一个明显的错误!你提出了一个非常好的观点,看看它是如何扩展的,我使用了 CircleCI 的 compiled 视图,它实际上是在重新评估。

标签: yaml circleci


【解决方案1】:

答案是锚点存储的是插值模板,而不是插值字符串

我通过使用@jonrsharpe 的建议来查看配置文件的扩展版本发现了这一点。您可以在 CircleCI 中查看此内容,查看后很明显问题在于它正在被重新插值。

# Expanded view snippet of config.yml

- restore_cache:
        key: v8-npm--{{ .Branch }}-{{arch}}-{{checksum "~/project/angular/package-lock.json"}}
    - run:
        name: Install Node modules
        command: |
          cd ~/project/angular
          npm ci
    - save_cache:
        key: v8-npm--{{ .Branch }}-{{arch}}-{{checksum "~/project/angular/package-lock.json"}}
        paths:
        - ~/project/angular/node_modules/
        - /usr/local/bin/node_modules
        - /home/circleci/.cache/

(注意校验和不同的原因是我应该去npm ci而不是npm install ci,就像我实际做的那样)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 2017-08-08
    相关资源
    最近更新 更多