如何在GitHub Actions的hashFiles函数调用中嵌套变量?
GitHub Actions中hashFiles无法解析变量参数的原因及解决方法
问题原因
这是正常的机制限制。GitHub Actions的表达式解析有优先级:hashFiles属于函数调用,它的参数会被当作字面量字符串优先解析,不会嵌套解析内部的${{ inputs.root-path }}表达式。也就是说第一次调用时,hashFiles实际接收的参数是原始字符串repo/${{ inputs.root-path }}/package-lock.json,而非替换后的repo/env/package-lock.json,自然找不到目标文件,返回空值。
解决方法
要在hashFiles中使用变量输入,需要先完成路径的拼接,再传入函数:
方法1:用format函数拼接路径
通过format函数把变量和固定路径部分组合成完整路径,再传给hashFiles:
- name: DEBUG run: | set -x ls -l repo/${{ inputs.root-path }}/package-lock.json echo "HASH: ${{ hashFiles(format('repo/{0}/package-lock.json', inputs.root-path)) }}" echo "HASH: ${{ hashFiles('repo/env/package-lock.json') }}"
方法2:通过环境变量传递路径
先把完整路径存入环境变量,再用环境变量作为hashFiles的参数:
- name: DEBUG env: LOCK_FILE_PATH: repo/${{ inputs.root-path }}/package-lock.json run: | set -x ls -l $LOCK_FILE_PATH echo "HASH: ${{ hashFiles(env.LOCK_FILE_PATH) }}" echo "HASH: ${{ hashFiles('repo/env/package-lock.json') }}"
两种方法都能让hashFiles正确获取到替换后的实际文件路径,从而计算出正确的哈希值。
内容的提问来源于stack exchange,提问作者Josh M.
相关产品推荐
相关产品推荐

